为了账号安全,请及时绑定邮箱和手机立即绑定

将 2 个具有相同键和值的词典组合在一起

将 2 个具有相同键和值的词典组合在一起

holdtom 2022-09-13 15:19:04
我正在使用字典,我想将其组合在一起。字典如下,pythondevices = [{'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}]它们具有共同点(标识符)。我正在做的是使用一对循环并检查它们是否相同。如果相同,我将两个词典组合在一起。EUIEUI最终结果是,[{'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)      breakprint(data)实际上它工作得很好,但我认为它可以是一个更好/更容易/更悸动的选择来做同样的事情。有人知道另一种方法吗?
查看完整描述

3 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

由于 在两个数据列表中似乎是唯一的,因此您可以立即使用字典,它将 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, {}))


查看完整回答
反对 回复 2022-09-13
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

从迭代工具导入zip_longest

结果 = [{**u, **v} 为你, v in zip_longest(数据, 设备, 填充值={})] 打印(结果)


查看完整回答
反对 回复 2022-09-13
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

我考虑了.

此方法保留原始和 。len(set(d['EUI'] for d in devices) ^ set(d['EUI'] for d in data)) > 0devicesdata


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 = {...}:制作关于 的键控词典。EUIdevices

  • [{**device_dict[datum['EUI']], **datum} for datum in data]:在循环数据时合并基准字典和设备字典

  • **device_dict.pop(datum['EUI'], {})而不是 :考虑是否不在 中。也从处理的s。**device_dict[datum['EUI']]datum['EUI']device_dictpopEUI

  • + list(device_dict.values()):附加其余部分(仅在device_dictdevices)

转角案例数据:

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



查看完整回答
反对 回复 2022-09-13
  • 3 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信