如何在列表理解期间检查列表的条件?

时间:2017-12-27 18:03:31

标签: python list-comprehension python-3.6

假设我有三个单词的列表,我想生成一个包含单词中字符的列表。

这可以使用for循环或列表理解轻松实现:

wordList = ["one", "two", "three"]
letterList = []

# Solution 1:

for word in wordList:
    for letter in word:
        letterList.append(letter)

# Solution 2:

letterList = [letter for word in wordList for letter in word]

print(letterList) # Prints: ['o', 'n', 'e', 't', 'w', 'o', 't', 'h', 'r', 'e', 'e']

然而,当这个问题变得更加困难时,我无法找到使用列表理解的解决方案。

例如,假设我想生成上一个列表,但我也希望删除任何重复的字符。

我可以使用for循环执行此操作:

wordList = ["one", "two", "three"]
letterList = []

for word in wordList:
    for letter in word:
        if letter not in letterList:
            letterList.append(letter)

print(letterList) # Prints: ['o', 'n', 'e', 't', 'w', 'h', 'r']

所以,我的问题是:如何在列表理解期间检查项目是否在正在构建的列表中?或者更简单地说:我如何使用list-comprehensions进行上述操作?

3 个答案:

答案 0 :(得分:3)

在Python 3.6中,字典是有序的。因此,您可以使用词典理解:

>>> list({letter:None for word in wordList for letter in word}.keys())
['o', 'n', 'e', 't', 'w', 'h', 'r']

从Python 3.7开始,将保证订购:

  

python news:@gvanrossum刚刚宣布dicts现在保证保留插入顺序。这是漫长旅程的结束。   source(2017-12-15)

答案 1 :(得分:2)

如果顺序不重要,只需使用集合理解

letter_set = {letter for word in wordList for letter in word}

如果订单很重要,那就会有点粗鲁

seen = set()
letter_list = [x for word in wordlist for x in word if x not in seen and not seen.add(s)]

或使用类似命令的词典

from collections import OrderedDict
my_list = OrderedDict.fromkeys(letter for word in wordList for letter in word).keys()

答案 2 :(得分:0)

您已经获得了解决方案,但这是一个不同的解决方案:

不使用该列表理解结果,而是将该列表理解用于逻辑并将其附加到新列表中:

wordList = ["one", "two", "three"]
letterList = []
[letterList.append(letter) for word in wordList for letter in word if letter not in letterList]
print(letterList)

输出:

['o', 'n', 'e', 't', 'w', 'h', 'r']