【问题标题】:Function that retrieves and returns letters from a list of lists从列表列表中检索和返回字母的函数
【发布时间】:2017-03-13 19:52:15
【问题描述】:

我正在编写一个函数,它需要遍历列表列表,收集所有大写或小写字母,然后返回一个列表,其中包含按顺序找到的每个字母的 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

【问题讨论】:

  • Python 3 还是 Python 2?
  • @Rob 使用 Python 3

标签: python list python-3.x return letters


【解决方案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']

【讨论】:

  • 谢谢其他答案也很好,但这似乎是完成此任务的最简单方法
【解决方案2】:

在现有代码的基础上构建:

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 可以让我们的字母更加整齐。然后我们遍历提供的每个列表(lot 中的每个 sublot),然后对于每个元素(x),我们检查它是否在我们的所有字母列表中和 不在 在我们找到的字母列表中。如果是这种情况,我们将其添加到我们的输出中。

【讨论】:

    【解决方案3】:

    这也可以通过使用chainOrderedDictisalpha 来完成,如下所示

    >>> 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 是您最好的朋友,我建议将所有这些食谱放在一个随时可用的文件中,它们总是很有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 2016-07-06
      • 2019-05-20
      • 2022-01-18
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多