Функция, которая извлекает и возвращает письма из списка списков
Я пишу функцию, которая должна пройти по списку списков, собрать все буквы в верхнем или нижнем регистре, а затем вернуть список с 1 буквой в каждой найденной последовательности. Если буква появляется несколько раз в списке списков, функция должна сообщить только в первый раз, когда видит букву.
Например, если список списков был [['.', 'M', 'M', 'N', 'N'],['.', '.', '.', '.', 'g'], ['B', 'B', 'B', '.','g']], тогда вывод функции должен вернуть ["M","N","g","B"].
Код, который у меня есть, кажется, может работать, но, похоже, не работает. Любая помощь приветствуется
def get_symbols(lot):
symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
newlot = []
for i in lot:
if i == symbols:
newlot.append(symbols)
return newlot
else:
return None
3 ответа
Есть несколько вещей не так с вашим кодом. Ты используешь return
в неправильном месте, зацикливаясь только на внешнем списке (не на элементах в подсписках), и вы добавляете symbols
в newlot
вместо соответствующего элемента.
def get_symbols(lot):
symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' # You should define this OUTSIDE of the function
newlot = []
for i in lot: # You are iterating over the outer list only here
if i == symbols: # == does not check if an item is in a list, use `in` here
newlot.append(symbols) # You are appending symbols which is the alphabet
return newlot # This will cause your function to exit as soon as the first iteration is over
else:
return None # No need for this
Вы можете использовать двойной for
цикл и использование in
проверить, находится ли персонаж в symbols
и не уже в newlot
:
l = [['.', 'M', 'M', 'N', 'N'],['.', '.', '.', '.', 'g'], ['B', 'B', 'B', '.','g']]
symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def get_symbols(lot):
newlot = []
for sublist in lot:
for i in sublist:
if i in symbols and i not in newlot:
newlot.append(i)
return newlot
Это вывод для вашего списка:
>>> get_symbols(l)
['M', 'N', 'g', 'B']
Чтобы создать существующий код:
import string
def get_symbols(lot):
symbols = string.ascii_lowercase + string.ascii_uppercase
newlot = []
for sublot in lot:
for x in sublot:
if x in symbols and x not in newlot:
newlot.append(x)
return newlot
print get_symbols([['.', 'M', 'M', 'N', 'N'],['.', '.', '.', '.', 'g'], ['B', 'B', 'B', '.','g']])
С помощью string
получает нам письма немного более аккуратно. Затем мы перебираем каждый предоставленный список (каждый sublot
из lot
), а затем для каждого элемента (x
), мы проверяем, есть ли оно в нашем списке всех писем, а не в нашем списке найденных писем. Если это так, мы добавляем его в наш вывод.
Это также можно сделать с помощью chain, OrderedDict и isalpha следующим образом
>>> from collections import OrderedDict
>>> from itertools import chain
>>> data = [['.', 'M', 'M', 'N', 'N'],['.', '.', '.', '.', 'g'], ['B', 'B', 'B', '.','g']]
>>> temp = OrderedDict.fromkeys(chain.from_iterable(data))
>>> [x for x in temp if x.isalpha()]
['M', 'N', 'g', 'B']
>>>
chain.from_iterable будет служить той же цели, как если бы вы объединили все подсписки в одном
Поскольку заказ актуален, OrderedDict
будет сервер той же цели, что и set
удалив дубликаты с добавленным бонусом сохранения порядка первого экземпляра добавленного объекта. fromkeys
class-method создаст словарь с заданными ключами и тем же значением, которое по умолчанию None
и, так как мы не заботимся об этом, для нашей цели это набор заказчиков
Наконец, isalpha скажет вам, является ли строка буквой или нет
Вы также можете взглянуть на рецепт unique_everseen, потому что itertools - ваш лучший друг, я рекомендую поместить все эти рецепты в файл, который всегда под рукой, они всегда полезны