2011-06-05 50 views
5

我对这个python代码有些头痛。在从列表创建字典时丢失python代码中的元素?

print "length:", len(pub) # length: 420 
    pub_dict = dict((p.key, p) for p in pub) 
    print "dict:", len(pub_dict) # length: 163 

如果我没有理解这个权利,我得到包含属性p.key为重点,并作为其的pub每个元素值的对象p的字典。是否有一些副作用我没看到?因为len(pub_dict)应该和len(pub)一样,它肯定不在这里,还是我误解了?

+8

如果在'pub'中有多个'p'与'p.key'相同,最后一个最终会出现在词典中,因为它每个键只能保存一个值。 – 2011-06-05 19:43:48

+2

@Sven:是的,有一些!感谢您指出了这一点!现在我知道错误来自哪里。也许你想把你的评论变成答案,所以我可以接受它。 – Aufwind 2011-06-05 19:44:32

回答

3

既然你可以有数个p用相同的密钥,那么你可以使用列表作为价值新dicitionary内你的关键:

pub_dict = {}  
for p in pub: 
    if not p.key in pub_dict: 
     pub_dict[p.key] = [] 
    pub_dict[p.key].append(p) 

或者,如果您需要唯一标识每条记录,则可以使用任何组合键(例如键+任何其他p值)

-1
pub_dict = {} 
for i,p in enumerate(pub): 
    pub_dict[p.key] = p 
    print i+1,len(pub_dict) 

必须给你点亮的问题