2016-10-31 9 views
2

Я пишу функцию, которая должна пройти список списков, собрать все буквы в верхнем или нижнем регистре, а затем вернуть список с 1 каждой буквой, найденной в заказ. Если письмо появляется несколько раз в списке списков, функция должна только сообщать о первом просмотре письма.Функция, которая извлекает и возвращает буквы из списка списков

Например, если список списков был [['.', 'M', 'M', 'N', 'N'], ['.', '.', '.', ' . ',' g '], [' B ',' B ',' B ','. ',' g ']], тогда выход функции должен возвращать ["M", "N", "g", " В "].

Код, который я до сих пор, кажется, может работать, но он, похоже, не работает. Подсказка:

def get_symbols(lot): 

    symbols = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' 

    newlot = [] 

    for i in lot: 
     if i == symbols: 
      newlot.append(symbols) 
      return newlot 
     else: 
      return None 
+0

Python 3 или Python 2? –

+0

@Rob Использование Python 3 – warrior4223

ответ

1

В коде есть несколько неправильных вещей. Вы используете 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'] 
+0

Спасибо, что другие ответы были хороши, но это похоже на самый простой способ выполнить это – warrior4223

3

На основе существующего кода:

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, мы получаем буквы более аккуратно. Затем мы перебираем каждый представленный список (каждый sublot10 из lot), а затем для каждого элемента (x) мы проверяем, является ли он как в нашем списке всех букв, так и не в нашем списке найденных писем. Если это так, добавим его к нашему выводу.

0

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

Наконец isalpha скажет вам если строка является письмо или нет

вы также можете взглянуть на unique_everseen рецепт, потому что itertools это ваш лучший друг, я рекомендую ставить все эти рецепты в файле, который всегда под рукой, они всегда полезны