如何从列表中返回字符串列表?

时间:2016-10-27 19:47:05

标签: python python-3.x

尝试返回列表行中找到的字符串列表。但是顺序必须从左到右从顶行到最低而不返回重复。我不知道该怎么办。如果字母A到Z与列表匹配,我是否需要为字母A到Z制作IF语句,然后将它们附加到新列表中?

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']]

5 个答案:

答案 0 :(得分: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)

顺便说一下,无论是否已经在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 

答案 2 :(得分: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))

答案 3 :(得分: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

答案 4 :(得分: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']