我正在使用python
词典,并且希望将其合并。字典如下所示,
devices = [{'EUI':123,'Name':'gum 1'},{'EUI':456,'Name':'gum 2'},{'EUI':789,'Name':'gum 3'}]
data = [{'EUI':123,'data':111},{'EUI':456,'data':222},{'EUI':789,'data':333},{'EUI':456,'data':444},{'EUI':789,'data':555}]
它们的共同点是EUI
(标识符)。我正在做的是使用一对循环,并检查EUI
是否相同。如果相同,我将两个字典合并。
最终结果是
[{'EUI': 123, 'data': 111, 'Name': 'gum 1'}, {'EUI': 456, 'data': 222, 'Name': 'gum 2'}, {'EUI': 789, 'data': 333, 'Name': 'gum 3'}, {'EUI': 456, 'data': 444, 'Name': 'gum 2'}, {'EUI': 789, 'data': 555, 'Name': 'gum 3'}]
我的完整代码如下,
devices = [{'EUI':123,'Name':'gum 1'},{'EUI':456,'Name':'gum 2'},{'EUI':789,'Name':'gum 3'}]
data = [{'EUI':123,'data':111},{'EUI':456,'data':222},{'EUI':789,'data':333},{'EUI':456,'data':444},{'EUI':789,'data':555}]
print(data)
for da in data:
for dev in devices:
if dev['EUI'] == da['EUI']:
da.update(dev)
break
print(data)
实际上,它可以完美工作,但是我认为这样做可以是更好/更容易/ pythonic的选择。有人知道另一种方式吗?
非常感谢您!
答案 0 :(得分:1)
由于EUI
在两个数据列表中似乎是唯一的,因此您可以立即使用字典,从而将EUI映射到其他数据:
devices = {d.pop('EUI'): d for d in devices}
data = {d.pop('EUI'): d for d in data}
然后您可以合并EUI键:
for k, d in data.items():
d.update(devices.get(k, {}))
答案 1 :(得分:0)
我考虑了len(set(d['EUI'] for d in devices) ^ set(d['EUI'] for d in data)) > 0
的情况。
此方法保留原始的devices
和data
。
devices = [{'EUI': 123, 'Name': 'gum 1'}, {'EUI': 456, 'Name': 'gum 2'},
{'EUI': 789, 'Name': 'gum 3'}]
data = [{'EUI': 123, 'data': 111}, {'EUI': 456, 'data': 222},
{'EUI': 789, 'data': 333}]
device_dict = {
device['EUI']: device
for device in devices
}
results = [
{**device_dict.pop(datum['EUI'], {}), **datum} for datum in data
] + list(device_dict.values())
print(results)
输出:
[{'EUI': 123, 'Name': 'gum 1', 'data': 111}, {'EUI': 456, 'Name': 'gum 2', 'data': 222}, {'EUI': 789, 'Name': 'gum 3', 'data': 333}]
说明:
device_dict = {...}
:制作关于EUI
的{{1}}键字典。devices
:在循环数据时合并基准字典和设备字典[{**device_dict[datum['EUI']], **datum} for datum in data]
而不是**device_dict.pop(datum['EUI'], {})
:考虑**device_dict[datum['EUI']]
是否不在datum['EUI']
中。也是device_dict
来自已处理的pop
的内容。EUI
:追加+ list(device_dict.values())
(仅包含device_dict
的词典)拐角案例数据:
devices
输出:
devices = [{'EUI': 123, 'Name': 'gum 1'}, {'EUI': 456, 'Name': 'gum 2'},
{'EUI': 789, 'Name': 'gum 3'}, {'EUI': 888, 'Name': 'gum 4'}]
data = [{'EUI': 123, 'data': 111}, {'EUI': 456, 'data': 222},
{'EUI': 789, 'data': 333}, {'EUI': 777, 'data': 444}]
答案 2 :(得分:0)
从itertools导入zip_longest
result = [{****,** v} for zip_longest中的u,v(数据, fillvalue = {})]打印(结果)