Объединение двух списков диктов в Python, когда некоторые диктанты являются дубликатами

1

У меня есть два словаря:

x=[{'id':1, 'var1':2},
   {'id':1, 'var1':2},
   {'id':2, 'var1':2}]

y=[{'var2':1, 'var3':2},
   {'var2':3, 'var3':3},
   {'var2':4, 'var3':4}]

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

z=[{'id':1, 'var1':2, 'var2':1, 'var3':2},
   {'id':1, 'var1':2, 'var2':3, 'var3':3},
   {'id':2, 'var1':2, 'var2':4, 'var3':4}]

Однако, когда я использую следующую функцию слияния:

def merge_x_and_y(x_data, y_data):
    for x_entry, y_entry in zip(x_data, y_data):
        x_entry.update(y_entry )
    return x_data

Вместо этого я получаю:

z=[{'id':1, 'var1':2, 'var2':1, 'var3':2},
   {'id':1, 'var1':2, 'var2':1, 'var3':2},
   {'id':2, 'var1':2, 'var2':2, 'var3':3}]

Поэтому, если dict в x является дубликатом, он дублирует dict из y, чего я не хочу. Я хочу, чтобы каждый x dict был объединен с другим y dict (даже если x dict является дубликатом).

Есть ли способ объединить каждый x dict с ay dict, игнорируя дубликаты?

Редактировать:

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

До слияния я попытался расширить данные, используя:

def expand_x(x):
    processed_x_data = []     
    [processed_x_data .extend([entry]*entry['count']) for entry in x]
    return processed_x_data 

После выполнения этого шага следует перераспределить уникальный идентификатор каждой записи, чтобы избежать двойной ссылки?

  • 1
    Это не то, как словари сделаны в Python. Вместо этого они должны выглядеть как {key1: value1, key2: value2}
  • 0
    Действительный пункт - я буду редактировать
Показать ещё 3 комментария
Теги:
list
dictionary
merge

2 ответа

2
Лучший ответ

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

def merge_x_and_y(x_data, y_data):
    result = [a.copy() for a in x_data]
    [a.update(b) for a, b in zip(result, y_data)]
    return result

и скажи мне, если это трюк =)

  • 0
    Привет, Леник, я расширил вопрос. Спасибо Эд
  • 0
    Ваше предложение вернуло «Нет» для всех записей, когда я попробовал.
Показать ещё 3 комментария
0

Я должен сделать предположение о ключах в словарях, но попробуйте это:

id = "id"
var1 = "v1"
var2 = "v2"
var3 = "v3"

x=[{id:1, var1:2},
   {id:1, var1:2},
   {id:2, var1:2}]

y=[{var2:1, var3:2},
   {var2:3, var3:3},
   {var2:4, var3:4}]

z = []
for i in range(len(x)) :
    z.append(dict(**x[i],**y[i]))

for i in z :
    print(i)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню