【问题标题】:Python list comprehension to append letter without duplicates [duplicate]Python列表理解附加没有重复的字母[重复]
【发布时间】:2016-06-20 10:21:13
【问题描述】:

我正在学习 Python 中的列表推导。我要从单词列表中附加字母并形成一个新列表,但没有重复。 这就是我正在尝试的:

wordlist = ['cat','dog','rabbit']

letterlist = [aletter for aword in wordlist  for aletter in aword if aletter not in letterlist]

print letterlist

我收到以下错误:

Traceback (most recent call last):
  File "training.py", line 5, in <module>
    letterlist = [aletter for aword in wordlist  for aletter in aword if aletter not in letterlist]
NameError: name 'letterlist' is not defined

我做错了什么?

【问题讨论】:

  • 是的,我知道集合可以删除重复项,但我正在寻找不涉及集合的解决方案。
  • 另请参阅 here、here 和 here,以及来自基本 Google 搜索的许多其他结果。

标签: python list list-comprehension


【解决方案1】:

letterlist 直到列表理解完成后才被定义。因此,您不能在其内部引用它。一个函数只能引用自己,因为该函数在定义之后才被调用,但是列表推导作为定义的一部分被执行,所以它不能引用自己。一种可能的方法是在没有测试的情况下定义列表,然后删除重复项:

letterlist = list(set(["".join(wordlist)]))  # Modified from idjaw's answer

使用set() 使其成为列表(删除重复项),使用list 将其转换回列表。

如果您真的不想使用set,那么使用列表推导式可能不是最好的方法。您可以像这样使用for 循环:

letterlist = []
for char in "".join(wordlist):
    if char not in letterlist:
        letterlist.append(char)

【讨论】:

  • 那么这应该可以正常工作吗? wordlist = ['cat','dog','rabbit'] letterlist = [] print [alette for aword in wordlist for aword in aword if alert not in letterlist] 但它不会删除重复项!
  • @Batman:那是因为您在创建列表理解时没有修改 letterlist。试试我上面给出的set 方式。
  • 明白了!这意味着列表推导仅适用于非常特定的用例,当您想要附加内容而不执行任何大小写检查时。
  • @Batman:在大小写检查中使用列表推导是完全可以的,但是大小写检查不能涉及您正在创建的列表。例如,您可以找到一个从 1 到 40 的数字列表,这些数字具有整数平方根,[x for x in range(1, 41) if not ((x ** 0.5)%1)] 这肯定有大小写检查,但不涉及当前正在创建的列表。
【解决方案2】:

如果您只是想摆脱重复,您可能需要使用set()。

x = [1,1,14,4,47,7,7,14,47]
list(set(x))

【讨论】:

    【解决方案3】:

    在这种特殊情况下,列表理解可能不是采用的方法。 只需将 for 循环放在外面并将元素附加到您的列表中,这样当您检查列表时,它确实存在。 无论如何,您使用的算法的复杂性将非常可怕:/

    【讨论】:

      【解决方案4】:

      如果你通过从列表中创建一个字符串然后调用 set 来获得所有唯一字符,这会更简单:

      set(''.join(wordlist))
      

      如果它必须是一个列表,只需调用列表就可以了:

      list(set(''.join(wordlist)))
      

      set 和 join 的信息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-11
        • 2011-06-15
        • 2013-01-26
        • 2019-03-16
        • 2014-12-09
        • 1970-01-01
        相关资源
        最近更新 更多