【发布时间】:2021-03-12 14:44:23
【问题描述】:
我有两个列表,每个列表包含约 100 个字典。此处显示了一个虚拟插图:
first = [
{"ip-10-1-1-1": {"job": {"company": "IBM", "title": "engineer"}}},
{"ip-10-1-1-20": {"job": {"company": "Dell", "title": "manager"}}},
{"ip-10-1-1-35": {"job": {"company": "Apple", "title": "CEO"}}},
]
second = [
{"ip-10-1-1-1": {"demographics": {"age": 30, "gender": "female"}}},
{"ip-10-1-1-20": {"demographics": {"age": "30", "gender": "male"}}},
{"ip-10-1-1-49": {"demographics": {"age": "32", "gender": "female"}}},
]
我正在尝试将这些与此结果合并:
[
{
"ip-10-1-1-1": {
"demographics": {"age": 30, "gender": "female"},
"job": {"company": "IBM", "title": "engineer"},
}
},
{
"ip-10-1-1-20": {
"demographics": {"age": "30", "gender": "male"},
"job": {"company": "Dell", "title": "manager"},
}
},
{"ip-10-1-1-35": {"job": {"company": "Apple", "title": "CEO"}}},
{"ip-10-1-1-49": {"demographics": {"age": "32", "gender": "female"}}},
]
我几乎可以通过循环遍历second 和first 来实现这一点,如下所示:
merged = []
for d1 in second:
for k1 in d1.keys():
for d2 in first:
for k2 in d2.keys():
if k2 == k1:
d1[k1]["job"] = d2[k2]["job"]
merged.append(d1)
print(merged)
不过,我是 python 新手,我希望/认为必须有一种更 Python 的方式来做到这一点。
编辑:更复杂的事情-我可以在first 中拥有密钥,但在second 中没有,反之亦然。我已更新示例以反映这一点。
【问题讨论】:
-
请发布一个更新的问题(带有您感兴趣的输入/输出示例)
-
任一列表是否可以包含多个具有相同 top-level 键的字典?例如
[{'u1':,,,}, {'u2':...}, {'u1':...}] -
@RiccardoBucco 这不是我在上面所做的吗?我展示了这两个列表和我想要的结果,以及一个我有但不喜欢的丑陋解决方案......
-
好吧,我为您发布的示例提供了一个解决方案 :) 但您不喜欢它,因为您提供给我们的密钥不正确。好吧,那么请用您正在谈论的键更新您的示例,我会相应地更改我的答案
-
一个非常难看的解决方案,而不是 pythonic
[{list(i[0].keys())[0]:{l:k[l] for j in i for k in j.values() for l in k}} for i in zip(first, second)]
标签: python