用Python生成器填充并打印set()项目
我有一个生成器:
foundUnique = set()
def unique_items(myList, index, clearFlag):
for item in myList:
if clearFlag is True:
foundUnique.clear()
clearFlag = False
if item[index] not in foundUnique:
yield item
foundUnique.add(item[index])
我正在使用这个 `unique_items` 来获取一个独特的列表:
senderDupSend = unique_items(ip, 4, True)
现在我想让我的集合可以被访问(也就是说,我可以打印出它的元素或者对某个特定的元素进行一些修改……)但是当我写:
for item in foundUnique:
print item
它什么都不打印出来!
但是如果我写:
for item in senderDupSend:
print item
for item in foundUnique:
print item
它会打印出所有找到的独特项目。
请告诉我我哪里做错了?我该如何解决这个问题?
1 个回答
4
问题在于 unique_items
是一个生成器,这意味着
senderDupSend = unique_items(ip, 4, True)
它是一个需要逐步提取的生成器。当你运行
for item in foundUnique:
print item
时,生成器实际上还没有执行,所以 foundUnique
仍然是空的。
当你之后继续执行
for item in senderDupSend: # This is what actually fills the list.
print item
for item in foundUnique:
print item
它应该会打印出这个集合两次:第一次是在它被构建的时候,第二次是在构建完成之后。
看起来你想做的是构建一个集合,这个集合从某个序列中的每个元素提取相同的索引。你可以很简单地这样做:
found_unique = set(item[index] for item in sequence)
在你展示的具体情况下,它会是:
found_unique = set(item[4] for item in ip)
如果你之后想要扩展这个集合,加入其他项目,你可以这样做:
found_unique.union(item[4] for item in other_ip_list)