Почему defaultdict создает массив для моих значений? - PullRequest
1 голос
/ 29 марта 2012

Я создаю дикт по умолчанию из массива массивов:

>>> array = [['Aaron','1','2'],['Ben','3','4']]
>>> d = defaultdict(list)
>>> for i in array: d[i[0]].append({"num1":i[1],"num2":i[2]})

Мой ожидаемый результат:

>>> d
>>> defaultdict(<type 'list'>, {'Aaron': {'num1': '1', 'num2': '2'}, 
'Ben': {'num1': '3', 'num2': '4'}})

Но мой результат:

>>> d
>>> defaultdict(<type 'list'>, {'Aaron': [{'num1': '1', 'num2': '2'}], 
'Ben': [{'num1': '3', 'num2': '4'}]})

Как будто defaultdict пытается сохранить мои значения в массиве, потому что это список источников!

Кто-нибудь знает, что здесь происходит и как я могу получить ожидаемый результат?

Ответы [ 2 ]

8 голосов
/ 29 марта 2012

Вам нужен простой словарь, а не defaultdict:

d = {}
for name, num1, num2 in array:
    d[name] = {"num1": num1, "num2": num2}

или с использованием словарного понимания

d = {name: {"num1": num1, "num2": num2} for name, num1, num2 in array}

Этот код приводит к d, являющемуся

{'Aaron': {'num1': '1', 'num2': '2'}, 'Ben': {'num1': '3', 'num2': '4'}}

A defaultdict(list) создает пустой список, если вы обращаетесь к несуществующему ключу.

7 голосов
/ 29 марта 2012

Когда вы звоните это:

d = defaultdict(list)

Это означает, что если вы пытаетесь получить доступ к d['someKey'], а он не существует, d['someKey'] инициализируется путем вызова list() без аргументов. Таким образом, вы получаете пустой список, к которому затем добавляете свой словарь. Вы, вероятно, хотите вместо этого:

d = defaultdict(dict)

, а затем это:

for i in array: 
  d[i[0]].update({"num1":i[1],"num2":i[2]})
...