2011-06-05 14 views
5

Tengo un dolor de cabeza con este código python.¿Perder elementos en el código python al crear un diccionario de una lista?

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

Si entiendo este derecho, aparece un diccionario que contiene el atributo p.key como la clave y el objeto p como su valor para cada elemento de pub. ¿Hay algún efecto secundario que no veo? Porque len(pub_dict) debe ser el mismo que len(pub) y ciertamente no está aquí, ¿o estoy equivocado?

+8

Si hay varios 'p' con la misma' p.key' en 'pub', solo el último terminará en el diccionario porque puede contener solo un valor por clave. –

+2

@Sven: ¡Sí, hay algunos! Gracias por señalar eso! Ahora sé de dónde viene el error. Tal vez quiera convertir su comentario en una respuesta, para que yo pueda aceptarlo. – Aufwind

Respuesta

3

Dado que es posible tener varios p con la misma clave entonces es posible que la lista como valor de uso para usted clave dentro de la nueva dicitionary:

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

O si es necesario que identifique de manera única cada registro, puede usar cualquier clave combinada como clave + cualquier otro valor de propiedad p

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

tendría dará luz sobre el problema

Cuestiones relacionadas