Python 用相同的键和值组合2个dict
我正在使用python字典,我想将其结合起来。这些格言如下:Python 用相同的键和值组合2个dict,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我正在使用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}] 它
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是否相同。如果是相同的,我结合两个dict
最终的结果是,
[{'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的选项。有人知道另一种方法吗
多谢各位 我考虑了lensetd['EUI']用于设备中的d的情况^setd['EUI']用于数据>0中的d。
此方法保留原始设备和数据
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']:设备
对于设备中的设备
}
结果=[
{**device_dict.popdatam['EUI'],{},**datum}用于数据中的数据
]+listdevice_dict.values
打印结果
输出:
[{'EUI':123,'Name':'gum 1','data':111},{'EUI':456,'Name':'gum 2','data':222},{'EUI':789,'Name':'gum 3','data':333}]
说明:
device_dict={…}:制作关于设备的EUI键词典。
[{**device_dict[datum['EUI']],**datum}用于数据中的数据:在循环数据时合并数据字典和设备字典
**device_dict.popdatam['EUI'],{}而不是**device_dict[datum['EUI']]:考虑datum['EUI']是否不在device_dict.中,也从处理过的EUI弹出。
+listdevice_dict.values:附加仅在设备中的其他设备字典
角落案例数据:
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}]
输出:
[{'EUI':123,'Name':'gum 1','data':111},{'EUI':456,'Name':'gum 2','data':222},{'EUI':789,'Name':'gum 3','data':333},{'EUI':777,'data':444},{'EUI':888,'Name':'gum 4}]
由于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, {}))
从itertools导入zip\u
结果=[{**u,**v}表示u,v在zip_longestdata、设备、,
fillvalue={}]printresult
设备的长度是否总是等于数据的长度?没有必要,我在您修改的数据中编辑了我的帖子,有些数据具有相同的EUI值和不同的数据值。在这种情况下,预期会有什么结果?例如,456222和456444表示“EUI”,“data”对。我发布的结果是,EUI是传感器的标识符。实际上,我要做的是将传感器的名称添加到数据记录中。这假设列表的顺序与问题类似: