[英]Combining 2 python lists of dictionaries
我有2条字典的python列表。 第一个python列表如下所示:
l1= [{'compu_method': 'ROTACC', 'aufloesung': '1024'},
{'compu_method': 'TMPOUTS', 'aufloesung': '1'}]
第二个python列表如下所示:
l2= [{'signal_name': 'XXXX', 'compu_method': 'ROTACC', 'min_wert': '-500', 'max_wert': '500'},
{'signal_name': 'YYYY', 'compu_method': 'TMPOUTS', 'min_wert': '-70', 'max_wert': '184'},
{'signal_name': 'ZZZZ', 'compu_method': 'TMPOUTS', 'min_wert': '-70', 'max_wert': '184'}]
这两个列表都具有compu_method公用的。 我想要从第二个列表中存在的所有compu_method的第一个列表中获取aufloesung 。 我想要一个这样的最终清单:
[{'signal_name': 'XXXX', 'compu_method': 'ROTACC', 'min_wert': '-500', 'max_wert': '500','aufloesung': '1024'},
{'signal_name': 'YYYY', 'compu_method': 'TMPOUTS', 'min_wert': '-70', 'max_wert': '184','aufloesung': '1'},
{'signal_name': 'ZZZZ', 'compu_method': 'TMPOUTS', 'min_wert': '-70', 'max_wert': '184','aufloesung': '1'}]
我尝试了下面的代码,但没有给出所需的输出:
from collections import defaultdict
d = defaultdict(dict)
for l in (l1, l2):
for elem in l:
d[elem['compu_method']].update(elem)
l3 = d.values()
print(l3)
代码需要什么修改?
您创建一个字典:
d1 = { m['compu_method']: m['aufloesung'] for m in l1}
一旦有了,只需映射到新的对象即可:
for i, m in enumerate(l2):
l2[i]['aufloesung'] = d1.get(m['compu_method'], None)
应该做的把戏...
在不使用其他模块的情况下,您可以尝试以下操作:
for i in l2:
for j in l1:
if i['compu_method']==j['compu_method']:
i['aufloesung']=j['aufloesung']
输出 :
[{'signal_name': 'XXXX', 'compu_method': 'ROTACC', 'min_wert': '-500', 'max_wert': '500', 'aufloesung': '1024'},
{'signal_name': 'YYYY', 'compu_method': 'TMPOUTS', 'min_wert': '-70', 'max_wert': '184', 'aufloesung': '1'},
{'signal_name': 'ZZZZ', 'compu_method': 'TMPOUTS', 'min_wert': '-70', 'max_wert': '184', 'aufloesung': '1'}]
您可以先将l1
转换为字典:
l1_map = {x["compu_method"]: x["aufloesung"] for x in l1}
然后只需更新l2
(或重建一个新列表):
for d in l2:
d["aufloesung"] = l1_map[d["compu_method"]]
print(l2)
# [{'signal_name': 'XXXX', 'compu_method': 'ROTACC', 'min_wert': '-500', 'max_wert': '500', 'aufloesung': '1024'}, {'signal_name': 'YYYY', 'compu_method': 'TMPOUTS', 'min_wert': '-70', 'max_wert': '184', 'aufloesung': '1'}, {'signal_name': 'ZZZZ', 'compu_method': 'TMPOUTS', 'min_wert': '-70', 'max_wert': '184', 'aufloesung': '1'}]
或使用**
语法:
[{**d, "aufloesung": l1_map[d["compu_method"]]} for d in l2]
假定"compu_method"
将出现在转换后的字典中。 如果您认为一个KeyError异常可能会出现,然后用dict.get()
中所示@ SSM的答案将是更安全的。
另一个解决方案可能是:
import copy
l3 = copy.deepcopy(l2)
[ll3.update({'aufloesung':ll1['aufloesung']}) for ll3 in l3 for ll1 in l1 if ll3['compu_method']==ll1['compu_method']]
你会得到:
l3
[{'signal_name': 'XXXX',
'compu_method': 'ROTACC',
'min_wert': '-500',
'max_wert': '500',
'aufloesung': '1024'},
{'signal_name': 'YYYY',
'compu_method': 'TMPOUTS',
'min_wert': '-70',
'max_wert': '184',
'aufloesung': '1'},
{'signal_name': 'ZZZZ',
'compu_method': 'TMPOUTS',
'min_wert': '-70',
'max_wert': '184',
'aufloesung': '1'}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.