Потерять элементы в коде Python при создании словаря из списка? - PullRequest
5 голосов
/ 05 июня 2011

У меня немного болит голова с этим кодом 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 в качестве ключа и объект p в качестве значения для каждогоэлемент pub.Есть ли какой-нибудь побочный эффект Я не вижу?Потому что len(pub_dict) должно быть таким же, как len(pub), и, конечно, его здесь нет, или я ошибаюсь?

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Поскольку у вас может быть несколько p с одним и тем же ключом, вы можете использовать список в качестве значения для вашего ключа в новом словаре:

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

Или, если вам необходимо уникально идентифицировать каждую запись, вы можете использовать любой комбинированный ключ, например, ключ + любое другое значение свойства *

0 голосов
/ 05 июня 2011
pub_dict = {}
for i,p in enumerate(pub):
     pub_dict[p.key] = p
     print i+1,len(pub_dict)

дал бы вам свет на проблему

...