簡體   English   中英

結合2個字典的python列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM