假设我有三个单词的列表,我想生成一个包含单词中字符的列表。
这可以使用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进行上述操作?
答案 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']