2016-08-18 3 views
1

Обычно я Wouldnt этот пост, но это сводит меня с ума в течение последних 10 часов ...Добавление элемента в список словарей

У меня есть 2 списка словарей. Но у них нет ни одного, ни одного общего. Если при повторении элементов во втором списке я сопоставляю пару ключевых значений из первого списка, то я должен добавить эти элементы в первый список в этом конкретном месте

так что первый список выглядит так:

list1 = [{'key11':'value11', 'key12':'value12', ...}, {'key11':'value111', 'key121':'value121', ...}] 

и песни2, как вышеуказанном списке:

list2 = [{'2key11':'value11', 'key12':'value12', '2key13': 'value'...}, {...}] 

Обратите внимание, что key12 одно и то же в обоих списках. Таким образом, конечный продукт, который я хочу это:

>list1 = list1 (some operation) list2 
>list1 
>[{'key11':'value11', 'key12':'value12', '2key11':'value11', ...}, {'key11':'value111', 'key121':'value121', ...}] 

Обратите внимание, что в желаемом результате, я добавил все вторые списки элементов словаря к словарю, который соответствовал key12 в list1 (первый словарь).

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

for i in range(len(list)): 
    # Now we need to map the panther data as well. 
    for pitem in plist: 
     # match the id's to the mapped symbols 

     if list[i]['key_id1'] == pitem['key_id1']: 
      if list[i]['key_id2'] == 'n/a': 
       list[i]['key_id2'] = pitem['key_id2'] 
      list[i]['somekey1'] = panther_item['somekey1'] 
      list[i]['somekey2'] = panther_item['somekey2'] 
      list[i]['somekey3'] = panther_item['somekey3'] # <- WHY IS THIS GIVING ME A KEY ERROR AND NOT THE ONE ABOVE IT? Both didnt exist in the dictionary stored in list. 
      list[i]['somekey4'] = panther_item['somekey4'] 
      list[i]['somekey5'] = panther_item['somekey5'] 

     elif list[i]['key_id2'] == pitem['key_id2']: 
      if list[i]['key_id1'] == 'n/a': 
       list[i]['key_id1'] = pitem['key_id1'] 
      list[i]['somekey1'] = panther_item['somekey1'] 
      list[i]['somekey2'] = panther_item['somekey2'] 
      list[i]['somekey3'] = panther_item['somekey3'] 
      list[i]['somekey4'] = panther_item['somekey4'] 
      list[i]['somekey5'] = panther_item['somekey5'] 

Но я получаю keyError на 'somekey3'. Почему «somekey3», а не «somekey2»? Оба там не были. Я помещаю их каждый раз в эту итерацию. И когда я печатаю 2 списка перед редактированием, они верны. Что здесь может быть неправильным?

+0

матч любой ключ/значение пары или просто ключ1? –

ответ

0

Я думаю, что у меня есть вопрос правильно, вы хотите найти объединение двух соответствующих словарей в 2 списках? Приведенный ниже код должен выполнить это. Помните, что в случае, если значения соответствующих ключей различны, y (list2 словари) будет иметь приоритет над x.

list3 = [] 
for x,y in zip(list1, list2): 
    z = x.copy() 
    for key, value in y.iteritems(): 
     if value != 'n/a': 
      z[key] = value 
    list3.append(z) 
+0

да. Я знаю об этом, но в чем, если что-то отсутствует в списке1? Помните, что я могу сопоставить до 2 ключей. что если я сопоставляю один ключ, то второй либо отсутствует, либо тот же, что и в списке1. Поэтому, если он отсутствует, было бы неплохо его заполнить. – Mixalis

+0

Я не уверен, что вы подразумеваете под «чего-то не хватает». Вы имеете в виду, что 1) отсутствует ключ, 2) значение или 3) полный словарь? В случае 1, где отсутствует ключ из одного из 2 сравниваемых словарей, этого кода будет достаточно. Для случая 2 значение ключа в словаре 2 будет иметь приоритет. Для случая 3 эта программа будет перебирать более короткие из 2 списков и сравнивать их. –

+0

Речь идет о списке словарей. Это должно использоваться в биоинформатике. Таким образом, каждый узел имеет словарь с парами ключ-значение. ключи все одинаковы, потому что они являются именами столбцов. и значения представляют собой строки. Так. представьте сценарий, в котором значение строки отсутствует в исходной матрице (установлено в «n/a»). он будет заполнен вторым списком. Что делать, если в первом списке сохранено это значение, а второй список соответствует второму ключу, но ** не ** первый.Он переопределит первый ключ с помощью «n/a» и, таким образом, потеряет информацию. Это единственная проблема с 'update'. – Mixalis

-1

Может быть, я получил это право, и вы хотите, чтобы добавить все значения словарей list2 для первого словаря в list1, который имеет «key12» в нем? Следующий код должен делать.

first_dict = next(d for d in list1 if 'key12' in d) 
for d in list2: 
    first_dict.update(d) 

Если вы хотите, чтобы добавить их к первому словарю из list1, который имеет общий ключ (ы) с Dict из list2 на той же позиции, то:

first_dict = next(a for a, b in zip(list1, list2) if set(a.keys()) & set(b.keys())) 
for d in list2: 
    first_dict.update(d) 
Смежные вопросы