2016-12-05 3 views
0

У меня есть список словарей -добавить значения в Словаре в питона

list1 = [{'id' : '1', 'b' : '2', 'c' : '3'}, {'id' : '4', 'b' : '5', 'c' : '6'}, {'id' : '7', 'b' : '8', 'c' : ''}] 

Основываясь на значении с будучи пустым или нет, я делаю вызов, который возвращает -

list2 - {'d' : '30', 'id' : 1}, {'d': '25', 'id' : '4'} 

Теперь я хочу изменить list1, так что в конечном списке есть значения d для идентификаторов, которые имеют c. Например -

list1 = [{'id' : '1', 'b' : '2', 'c' : '3', 'd' : '30'}, {'id' : '4', 'b' : '5', 'c' : '6', 'd' : '25'}, {'id' : '7', 'b' : '8', 'c' : ''}] 

Мой подход -

for l in list2: 
    current_list = {} 
    for l2 in list1: 
    if l2['id'] == l['id']: 
     current_list = l2 
     break 
    if current_list: 
     current_list['d'] = l['d'] 

Здесь фактическая ДИКТ не получает модифицирован. Как изменить фактический список? Кроме того, есть ли более простой способ сделать это?

+0

Означает ли порядок пунктов в списке? –

+0

Нет, порядок не имеет значения –

ответ

2

Я не уверен, что понимаю, чего вы пытаетесь достичь. Ваше письменное описание вашей цели не согласуется с вашим кодом. Основываясь на коде, я предполагаю, что вы хотите совместить данные на основе значений id.

# You've got some dicts. 
dicts = [ 
    {'id': '1', 'b': '2', 'c': '3'}, 
    {'id': '4', 'b': '5', 'c': '6'}, 
    {'id': '7', 'b': '8', 'c': ''}, 
] 

# You've got some other dicts having the same IDs. 
d_dicts = [ 
    {'d': '30', 'id': '1'}, 
    {'d': '25', 'id': '4'}, 
] 

# Reorganize that data into a dict, keyed by ID. 
dlookup = {d['id'] : d['d'] for d in d_dicts} 

# Now add that lookup data to the main list of dicts. 
for d in dicts: 
    i = d['id'] 
    if i in dlookup: 
     d['d'] = dlookup[i] 
1

Предполагая, что mr FMc верны, в python 3.5 есть действительный подход для слияния dicts. Что в этом случае будет привел нас к:

dicts = [ 
     {'id': '1', 'b': '2', 'c': '3'}, 
     {'id': '4', 'b': '5', 'c': '6'}, 
     {'id': '7', 'b': '8', 'c': ''}, 
    ] 

    d_dicts = [ 
     {'d': '30', 'id': '1'}, 
     {'d': '25', 'id': '4'}, 
    ] 

dicts = [{**d, **dict(*filter(lambda x: x["id"] == d["id"], d_dicts))} for d in dicts] 

Я люблю это любопытное выражение вместо того чтобы писать все это, но у него есть «выгода» от сбоев, а не перезаписывать материал, когда есть более одного dict с тем же идентификатором. Но мое решение все еще перезаписывает значения, если есть дубликаты ключей молча. Введенное значение является значением из второго значения в слиянии dict.

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