用Python生成器填充并打印set()项目

3 投票
1 回答
22159 浏览
提问于 2025-04-16 06:36

我有一个生成器:

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) 

撰写回答