python - 带有生成器的 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 内的列表中
- 每次我使用下一个(测试)时,它都会新生成,所以我无法添加下一个生成器
我将如何使用 listcomp 实现第一个代码片段?
解决方案
首先,让我们解决生成器问题。正如您所提到的,您希望在每次迭代中只使用一次 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)}))
推荐阅读
- sql - 如果 ABC 没有,则返回 YTD 值
- javascript - Firebase.auth() 在本地主机上的页面之间不持久
- c# - 将对象映射到 JSON 中的数组时出现 Json 反序列化错误
- c# - System.InvalidOperationException 调用异常
- c# - .NET Standard 2.0 连接到 Access 数据库
- bootstrap-4 - 轮播控件在引导程序版本 4 中不起作用
- spring-boot - Spring-boot 2.1.7 错误:无法实例化工厂类
- draw.io - 从分层 JSON/XML 生成 draw.io 地图
- android - 如何移除放置在 AR 屏幕上的 3d 对象
- mysql - 如何通过单个公式将文本批量添加到现有内容