Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用相同的键和值组合2个dict_Python_Python 3.x_Dictionary - Fatal编程技术网

Python 用相同的键和值组合2个dict

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}] 它

我正在使用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是否相同。如果是相同的,我结合两个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是传感器的标识符。实际上,我要做的是将传感器的名称添加到数据记录中。这假设列表的顺序与问题类似: