簡體   English   中英

通過鍵合並兩個字典的值

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

其中abdict | 將兩個鍵集的並集。

至於為什么你的代碼出錯。

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)
  1. 不在那里! 您在循環中定義的所有內容都會在循環進行時重新定義。
  2. 即使有匹配的鍵,它也會進入else塊。 例如,在你的情況下,比較ADIC_01ADIC_02"ok, A matched" 但是,然后它將DIC_01 ADIC_01中的D進行DIC_02"ok, A not found in DIC_02, not matched, add to NOT_MATCH" ,這是錯誤的,因為A是匹配的鍵,而A IS是DIC_02
  3. 不知道您是如何得到錯誤的,這似乎是非常錯誤的。
  4. 這些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_01DIC_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.

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