2015-05-21 4 views
-2

Я хочу знать, существует ли более элегантный способ присоединиться к списку словарей с другим словарем.Присоединиться к списку dict с dict в python

list1 = list() 
list1.append({"ip": '12.12.12.12', 'code': '123'}) 
list1.append({"ip": '12.12.12.11', 'code': '345'})  
dict2 = {"mask": "255.255.255.255"}    
nlist = list() 
for dict1 in list1:     
    dict1.update(dict2) 
    nlist.append(dict1)   
print nlist 

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

[{'ip': '12.12.12.12', 'code': '123', 'mask': '255.255.255.255'}, 
{'ip': '12.12.12.11', 'code': '345', 'mask': '255.255.255.255'}] 
+0

это ожидаемый выход или выход, который вы получаете? – pyUser

+0

Это ожидаемый результат, мне интересно, можете ли вы улучшить код – JohnPortella

+0

Желаете ли вы побочного эффекта, чтобы словари в 'list1' обновлялись _and_, добавленные в' nlist', т. Е. Оба списка относятся к тем же словарям? Или вы надеялись на новые копии диктов? – mhawke

ответ

2

Вашего код имеет побочный эффект, что он обновляет один и тот же экземпляр каждого объекта словаря, в результате чего в обоих list1 и nlist со ссылкой на одни и те же словарь объекты. После выполнения кода:

>>> list1 
[{'ip': '12.12.12.12', 'code': '123', 'mask': '255.255.255.255'}, {'ip': '12.12.12.11', 'code': '345', 'mask': '255.255.255.255'}] 
>>> nlist 
[{'ip': '12.12.12.12', 'code': '123', 'mask': '255.255.255.255'}, {'ip': '12.12.12.11', 'code': '345', 'mask': '255.255.255.255'} 
>>> [list1[i] is nlist[i] for i in range(len(list1))] 
[True, True] 
>>> list1[0]['newkey'] = 'value' 
>>> list1[0] 
{'ip': '12.12.12.12', 'code': '123', 'mask': '255.255.255.255', 'newkey': 'value'} 
>>> nlist[0] 
{'ip': '12.12.12.12', 'code': '123', 'mask': '255.255.255.255', 'newkey': 'value'} 

Приведенные выше показывает, что dicts являются одинаковыми, и поэтому любое изменение отражается в обоих списках.

Если вы просто хотели, чтобы обновить все словари list1, сделайте следующее:

dict2 = {"mask": "255.255.255.255"} 
for d in list1: 
    d.update(dict2) 
1

Вы можете пойти на список понимания, который выглядит немного проще. Не большая разница.

list1 = list() 
list1.append({"ip": '12.12.12.12', 'code': '123'}) 
list1.append({"ip": '12.12.12.11', 'code': '345'}) 
dict2 = {"mask": "255.255.255.255"} 
[ _dict.update(dict2) for _dict in list1] 
print list1 

Output: [{'ip': '12.12.12.12', 'code': '123', 'mask': '255.255.255.255'}, {'ip': '12.12.12.11', 'code': '345', 'mask': '255.255.255.255'}] 
+1

Не так много разница? После этого оператора 'list1'' '[None, None]' (потому что 'dict.update()' возвращает none. Это сильно отличается от ожидаемого результата. – mhawke

+0

Исправлено, спасибо за это. – Headrun