2010-11-05 34 views
1

我写了一个发电机:打印设置()项填补巨蟒发电机

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]) 

我用这个来得到所需的唯一列表后:

senderDupSend = unique_items(ip, 4, True) 

现在,我想我的设置可到达我(我可以打印它的元素或做特定的元素上的一些变化.....),但是当我写:

for item in foundUnique: 
    print item 

不打印输出!

但如果我写:

for item in senderDupSend: 
    print item 
for item in foundUnique: 
    print item 

它打印所有foundUnique项目。

请告诉我做错了什么?我怎么解决这个问题?

+0

@aaronasterling:圣! python总是让我感到惊讶。 – pyfunc 2010-11-05 07:57:50

回答

2

的问题是,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) 
+0

你对,但我有2个问题:1-如何解决这个问题2-生成器只是使物品超过运行一次(或保留它们提供的物品)为什么我可以在遍历senderDupSend后达到foundunique(当第一次迭代它保持foundunique的价值吗?我被发电机弄糊涂了) – Am1rr3zA 2010-11-05 08:29:17

+0

@ Am1rr3zA第一个问题很简单,使用一个传递给'set'构造函数的生成器表达式,如图所示。对于第二个,发电机将只运行一次它的值。在这种情况下,您正在让生成器在'foundUnique'中保留值,以便它们在生成器运行之后(但不是在之前)可用。 – aaronasterling 2010-11-05 08:33:48