Python列表理解,以附加字母而不重复

时间:2016-03-06 23:47:12

标签: python list list-comprehension

我在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

我做错了什么?

4 个答案:

答案 0 :(得分:4)

在列表推导完成之前,未定义

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)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

set(''.join(wordlist))

如果它必须是一个列表,只需在其上调用列表:

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

有关setjoin

的信息