2012-03-04 2 views
2

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

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}]} 

в то время как я ожидал:

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

ответ

6

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

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

4
[{}]*10 

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

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

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

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

Используйте list comprehension:

[{} for _ in range(10)] 
0

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

from collections import defaultdict 

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

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

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

Смежные вопросы