2016-10-27 2 views
2

Попытка вернуть список строк, найденных в строках списков. Но порядок должен быть слева направо, начиная от верхнего ряда до самого низкого, не возвращая дубликатов. Я не уверен, как действовать дальше. Должен ли я сделать инструкцию IF для букв от A до Z, если она соответствует списку, а затем добавить их в новый список?Как вернуть список строк из списка?

def get_locations(lst): 
    new_lst = [] # New list? 
    for i in range(len(lst)): 
     if 'A' lst[i] <= 'Z' or 'a' <= lst[i] <= 'z': #If strings are A to Z 
      new_lst.append # Add to new list? 
      return new_lst 

Пример списка: Он должен вернуться, как этого get_locations (LST) → [ "A", "B", "A", "Z", "C"]

lst1 = [['.', '.', 'a', 'B'], 
     ['.', '.', 'a', '.'], 
     ['A', '.', '.', 'z'], 
     ['.', '.', '.', 'z'], 
     ['.', '.', 'C', 'C']] 
+0

заказывает необходимо иметь? – Shasha99

ответ

3

Поедем через функцию построчно:

new_lst = [] # New list? 

Да, он создает новый список.

for i in range(len(lst)): 

Хотя это действительно так, редко существует причина перебора индексов списка в Python. Вы можете выполнять итерацию через элементы. Кроме того, это список списков, так что должны быть обработаны, а также:

for sublist in lst: 
     for character in sublist: 

После этого использования character вместо lst[i].

 if 'A' lst[i] <= 'Z' or 'a' <= lst[i] <= 'z': #If strings are A to Z 

Ошибка: 'A' lst[i]. Синтаксическая ошибка. В противном случае это может сработать, если character фактически является символом. Если это более длинная строка, это может привести к неожиданным результатам (в зависимости от того, что вы ожидаете):

 if 'A' <= character <= 'Z' or 'a' <= character <= 'z': 

Итак, интересный персонаж был найден. Добавьте его к результату?

  new_lst.append # Add to new list? 

Функция должна называться:

  new_lst.append(character) 

BTW, это добавляет характер независимо от того, был ли он уже в new_lst или нет. Я собираю его должен только добавить символ однажды:

  if character not in new_lst: 
       new_lst.append(character) 

Следующая строка возвращает список, но слишком рано:

  return new_lst 

Он не должен быть с отступом. Он должен быть за пределами циклов, чтобы результат возвращался после того, как все было зациклировано.

+1

До сих пор это самый подробный ответ, и мне также нравится, что «научить человека ловить рыбу» вместо «дать человеку рыбу». –

0

я имел тонна трудно понять, что вы имели в виду, но при условии, что я понял это, вы не были слишком далеко:

def get_locations(lst): 
    new_lst = [] # New list? 
    for row in lst: 
     for letter in row: 
      if ('A' <= letter <= 'Z' or 'a' <= letter <= 'z') and letter not in new_lst: #If strings are A to Z 
       new_lst.append(letter) # Add to new list? 
    return new_lst 
0
import re 

def get_locations(lst): 
    new_lst = [] # New list? Yes! 
    # Iterate directly over "flattened" list. That involves confusing 
    # nested list comprehension. Look it up, it's fun! 
    for i in [e for row in lst for e in row]: 
     # using regular expression gives more flexibility - just to show off :) 
     if re.match('^[a-zA-Z]+$', i) and i not in new_lst: #deal with duplicates 
      new_lst.append(i) # Add to new list? yes! 
    return new_lst # corrected indentation 


lst1 = [['.', '.', 'a', 'B'], 
     ['.', '.', 'a', '.'], 
     ['A', '.', '.', 'z'], 
     ['.', '.', '.', 'z'], 
     ['.', '.', 'C', 'C']] 

print(get_locations(lst1)) 
0

Ну, если вы не очень обеспокоены упорядочением Следующее утверждение будет достаточно мощным, чтобы держать длинные методы в стороне:

ans = {j for i in lst for j in i if j!='.'} 

И если поддержание порядка является обязательным иметь, то вы можете рассмотреть, используя следующий метод:

def get_locations(lst): 
    ans=[] 
    for i in lst: 
     for j in i: 
      if (j is not '.') and (j not in ans): 
       ans.append(j) 
    return ans 

Вы также можете использовать следующую версию генератора для вашей проблемы:

def get_locations(lst): 
    ans=[] 
    for i in lst: 
     for j in i: 
      if (j is not '.') and (j not in ans): 
       ans.append(j) 
       yield j 
0

Довольно простой. string.ascii_letters хороший ярлык, чтобы знать все буквы a-Z

import string 
def get_chars(lst): 
    new_list = [] 
    for nested_list in lst: 
     for char in nested_list: 
      if char not in new_list and char in string.ascii_letters: 
       new_list.append(char) 
    return new_list 

Тогда:

>>> get_chars(lst1) 
['a', 'B', 'A', 'z', 'C'] 
Смежные вопросы