У меня есть два словаря:
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
После выполнения этого шага следует перераспределить уникальный идентификатор каждой записи, чтобы избежать двойной ссылки?
У меня сильное впечатление, что повторяющиеся элементы в первом словаре не два разных элемента, а один и тот же элемент, упоминаемый дважды. Попробуйте этот код, чтобы объединить словари:
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
и скажи мне, если это трюк =)
Я должен сделать предположение о ключах в словарях, но попробуйте это:
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)