Обновление нескольких диктов на одном задании - PullRequest
2 голосов
/ 04 марта 2012

У меня есть диктат, к которому я добавил значение списка из 10 пустых диктов. Затем я пытаюсь добавить значение single к одному из списков в списке. Но, похоже, я установил все диктанты в списке. Есть идеи? Как я могу реализовать это, это не может работать?

bids={}
bids[1]=[{}]*10
bids[1][0][1]=0

Ставки печатаются как

{1: [{1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}, {1: 0}]}

пока я ожидаю:

* * 1010

Ответы [ 3 ]

6 голосов
/ 04 марта 2012

[{}]*10 создаст список с 10 ссылками на такой же объект словаря.Управляя этим единственным экземпляром, изменения, очевидно, влияют на весь список.

Вместо этого используйте [{} for _ in range(10)].

4 голосов
/ 04 марта 2012
[{}]*10

создает пустой словарь, а затем список из 10 элементов, каждый из которых является этим словарем.В коде это эквивалентно:

d = {}
[d, d, d, d, d, d, d, d, d, d]

Вам нужен список из 10 разных словарей, изначально все пустые.В коде вы бы написали это как:

[{}, {}, {}, {}, {}, {}, {}, {}, {}, {}]

Использовать понимание списка :

[{} for _ in range(10)]
0 голосов
/ 05 марта 2012

Другой подход заключается в том, что вместо значений, представляющих собой списки из 10 пустых диктов, вы можете или захотите сделать каждое значение диктантом в зависимости от того, что вы планируете, что еще вы планируете делать с ними:

from collections import defaultdict

bids={}
bids[1]=defaultdict(dict)
bids[1][0][1]=0

print bids
# {1: defaultdict(<type 'dict'>, {0: {1: 0}})}

Каждое значение будет автоматически инициализироваться в отдельный пустой словарь при первом обращении к нему. Словари не сохраняют порядок, как списки, но это то, что многим не нужно. Даже если это так, вы можете просто отсортировать их по ключам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...