Функция, которая извлекает и возвращает письма из списка списков

Я пишу функцию, которая должна пройти по списку списков, собрать все буквы в верхнем или нижнем регистре, а затем вернуть список с 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 - ваш лучший друг, я рекомендую поместить все эти рецепты в файл, который всегда под рукой, они всегда полезны

Другие вопросы по тегам