[英]Merge two dictionaries' values by keys
嗨,我想合並兩個字典的值,如果鍵是相同的。
DIC_01
{'A': ['Zero'],
'B': ['Zero'],
'C': ['Zero'],
'D': ['Zero']}
DIC_02
{'A': [2338.099365234375,
-3633.070068359375,
-73.45938873291016],
'D':[2839.291015625,
-2248.350341796875,
1557.59423828125]}
想法輸出
{'A': [[2338.099365234375,
-3633.070068359375,
-73.45938873291016],['Zero']],
'D': [[2839.291015625,
-2248.350341796875,
1557.59423828125]['Zero']]}
找不到鍵的輸出
{'B': ['Zero'],'C': ['Zero']}
我試過了
NO_MATCH={}
for k in DIC_01.keys():
DOC={}
for k2 in DIC_02.keys():
if k == k2:
DOC = k.values().update(k2.values())
else:
NO_MATCH.update(DIC_01)
DOC中沒有任何內容,所有詞典元素都位於NO_MATCH中,沒有錯誤消息。 不知道哪里出了問題,我也認為必須有更好的方法來做到這一點。 謝謝!
編輯:您可以聲明兩個單獨的詞典,並遍歷兩個詞典的所有鍵。 對於每次迭代,請檢查密鑰是否存在於DIC_02
和DIC_01
並連接兩個對應的列表
match, no_match = {}, {}
for i in {**DIC_01,**DIC_02}.keys():
if i in DIC_01 and i in DIC_02:
match[i] = DIC_01[i] + DIC_02[i]
else:
no_match[i] = DIC_01.get(i,[]) + DIC_02.get(i,[])
並不是特別花哨,但這應該可以解決您的需求
def merge(a, b):
out = {}
for key in a.keys() | b.keys():
if key in a and key in b:
out[key] = [a[key], b[key]]
elif key in a:
out[key] = a[key]
else:
out[key] = b[key]
return out
其中a
和b
是dict
。 |
將兩個鍵集的並集。
至於為什么你的代碼出錯。
NO_MATCH={}
for k in DIC_01.keys():
DOC={} # (1)
for k2 in DIC_02.keys(): # (2)
if k == k2:
DOC = k.values().update(k2.values()) # (3)
else:
NO_MATCH.update(DIC_01) # (4)
A
在DIC_01
與A
在DIC_02
, "ok, A matched"
。 但是,然后它將DIC_01
A
與DIC_01
中的D
進行DIC_02
, "ok, A not found in DIC_02, not matched, add to NOT_MATCH"
,這是錯誤的,因為A
是匹配的鍵,而A
IS是DIC_02
。 DIC_01
整個DIC_01
添加到NO_MATCH
,錯了! 固定:
MATCH = {}
NO_MATCH = {}
# This goes through all keys in DIC_01. If a key is also found in DIC_02,
# it's a "matched" key so it adds that key to the MATCH variable. If it's
# not in DIC_02, it's a "no matched" key -> add key to NO_MATCH variable.
for k in DIC_01.keys():
if k in DIC_02.keys():
MATCH[k] = [DIC_01[k], DIC_02[k]]
else:
NO_MATCH[k] = DIC_01[k]
# BUT...We are still missing the keys that are only in DIC_02. So we need
# another loop
for k in DIC_02.keys():
if k not in DIC_01.keys():
NO_MATCH[k] = DIC_02[k]
# This is the same as the loop above, without the if block.
更好的方法
一些列表理解將保持整潔。
MATCH = {key:[DIC_01[key], DIC_02[key]] for key in DIC_01 if key in DIC_02}
unmatch_1 = {key:DIC_01[key] for key in DIC_01 if key not in DIC_02}
unmatch_2 = {key:DIC_02[key] for key in DIC_02 if key not in DIC_01}
NOT_MATCH = {**unmatch_1, **unmatch_2}
說明:
MATCH = {key:[DIC_01[key], DIC_02[key]] for key in DIC_01 if key in DIC_02}
這一點,在英語中,創建一個新的字典match
。對於每一個關鍵DIC_01
,如果該鍵也DIC_02
,創建相同的密鑰match
,並分配從關鍵的兩個值DIC_01
和DIC_02
。
unmatch_1 = {key:DIC_01[key] for key in DIC_01 if key not in DIC_02}
對於DIC_01
每個鍵,如果不在DIC_02
,則創建一個鍵並分配DIC_01
的關聯值
unmatch_2 = {key:DIC_02[key] for key in DIC_02 if key not in DIC_01}
這...對於DIC_02
每個鍵,如果不在DIC_01
,則創建一個鍵並分配DIC_02
的關聯值
UNMATCH = {**unmatch_1, **unmatch_2}
這是合並2個字典的一種很酷的方法(僅適用於Python 3.5及更高版本)
看起來對於ChainMap
很有用
>>> a={'A': ['Zero'], ... 'B': ['Zero'], ... 'C': ['Zero'], ... 'D': ['Zero']} >>> b={'A': [2338.099365234375, ... -3633.070068359375, ... -73.45938873291016], ... 'D':[2839.291015625, ... -2248.350341796875, ... 1557.59423828125]} >>> map=ChainMap(b,a) >>> map['A'] [2338.099365234375, -3633.070068359375, -73.45938873291016] >>> map['C'] ['Zero']
關鍵優先級將按字典的順序排列,因此,如果您無法控制順序,或者['Zero']
混合並匹配:這種方法將無濟於事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.