2016-10-15 2 views
1

Вот код, который я хотел бы понять. Я создаю dict, используя элементы списка в качестве ключей, а другой список - значения по умолчанию. Затем обновите этот dict другим. Наконец, я хотел бы добавить к списку в dict. Приложение несколько раз используется для некоторых элементов. Я хотел бы добавить счастливого только один раз для каждого из значений dict.Python: добавление к списку, который является значением словаря

l=['a','b','c'] 
bm=dict.fromkeys(l,['-1','-1']) 
u={'a':['Q','P']} 
bm.update(u) 
bm 
# {'a': ['Q', 'P'], 'c': ['-1', '-1'], 'b': ['-1', '-1']} 
for k in bm.keys(): 
    bm[k].append('DDD') 
bm 
# {'a': ['Q', 'P', 'DDD'], 'c': ['-1', '-1', 'DDD', 'DDD'], 'b': ['-1', '-1', 'DDD', 'DDD']} 

Я ожидал, что добавление DDD произойдет один раз для c и b, как это:

{'a': ['Q', 'P', 'DDD'], 'c': ['-1', '-1', 'DDD'], 'b': ['-1', '-1', 'DDD']} 

ответ

1

это

bm=dict.fromkeys(l,['-1','-1']) 

ли повторно использовать один и тот же список ['-1','-1'] для всех ключей, в котором разъясняются эффект, который вы наблюдаете.

добиться того, что вы хотите, вы можете сделать это с Dict понимания

bm = {x:[-1,1] for x in ['a','b','c']} 

(петля в Словаре компе гарантирует, что другой экземпляр [-1,1] списка создается для каждого значения, что гарантирует независимость)

Полный пример:

bm = {x:[-1,1] for x in ['a','b','c']} 

u={'a':['Q','P']} 
bm.update(u) 
print(bm) 
for k in bm.keys(): 
    bm[k].append('DDD') 

print(bm) 

результат:

{'c': [-1, 1], 'a': ['Q', 'P'], 'b': [-1, 1]} 
{'c': [-1, 1, 'DDD'], 'a': ['Q', 'P', 'DDD'], 'b': [-1, 1, 'DDD']} 

Примечание: если вы хотите, чтобы все ключи доступны создать значение по умолчанию, если нет вы можете использовать defaultdict с лямбда, который создает другой экземпляр ['-1','-1'] каждый раз.

from collections import defaultdict 
bm = defaultdict(lambda : ['-1','-1']) 
+0

Thanks @ Jean-François Fabre для уточнения. Используя понимание dict, я мог получить то, что хотел. – Uday

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