首页 > 解决方案 > 带有生成器的 Python listcomp

问题描述

我想将生成器生成的单词添加到列表中,如果它在列表中是唯一的最多 10 次。

word_list = []
for i in range(10):
    next_word = next(test)
    if next_word not in word_list:
        word_list.append(next_word)

这就是我尝试的列表理解

word_list = [next(test) for next(test) in range(10) if next(test) not in word_list]

我遇到了两个问题

我将如何使用 listcomp 实现第一个代码片段?

标签: pythonlist-comprehension

解决方案


首先,让我们解决生成器问题。正如您所提到的,您希望在每次迭代中只使用一次 next(test) 。最简单的解决方案是循环测试,这与调用 next 完全一样:

word_list = [s for _, s in zip(range(10), test)]

此代码将从生成器中获取前 10 个单词。现在,您希望它只采用唯一值。如果您不介意顺序,则可以将其转换为 set,而不是在列表 comp 中检查:

word_list = set([s for _, s in zip(range(10), test)])

如果你不介意这个顺序,你可以使用OrderSet recipe,或者更简单地使用 OrderedDict:

from collections import OrderedDict    
word_list = [t[0] for t in OrderedDict({s:_ for _, s in zip(range(10), test)})]

您最终会得到与 for 循环中相同的输出。这个解决方案不是那么易读,我必须说我更喜欢使用旧的 nice for 循环。

或者甚至更好,正如@tobias_k 建议的那样:

from collections import OrderedDict
from itertools import islice
word_list = list(OrderedDict({s:s for s in islice(test, 0, 10)}))

推荐阅读