簡體   English   中英

根據匹配鍵的值比較 2 個字典

[英]Comparing 2 dictionaries based on values for matching keys

我有兩本字典:

S = {0: [1, 2, 3, 4], 
     1: [5, 6, 7, 8, 9, 10], 
     2: [11, 12, 13, 14, 15]}

R = {0: [1, 2, 8], 
    1: [8, 5, 10, 11, 15], 
    2: []}

如果列表中的任何數字匹配,我需要找出給定的鍵。 如果他們這樣做,則用“X”替換數字。

結果應該是這樣的

    F = {0: ['X', 'X', 3, 4], 
         1: ['X', 6, 7, 8, 9, 'X'], 
         2: [11, 12, 13, 14, 15]}
or 

F = [['X', 'X', 3, 4], ['X', 6, 7, 8, 9, 'X'], [11, 12, 13, 14, 15]]

如果 F 是第三本字典或列表列表,我無所謂。

我的代碼如下:

Solution = []

for x in S.values():
    for y in R.values():
        for j in y:
            for n, i in enumerate(x):
                if j == i:
                    x[n] = 'X'
                    
    Solution.append(x)  

問題是我將 R 中的每個值與 S 中的每個字典值進行比較。我不明白如何獨立於 [5] 比較例如 [1, 2, 3, 4] 到 [1, 2, 8] , 6, 7, 8, 9, 10] 到 [8, 5, 10, 11, 15]。

您可以使用集合

# This modifies S in place; use a new dict if you want to keep S
for k,li1 in S.items():
    li2=R.get(k,[])
    diff=set(li1)-set(li2)
    S[k]=[e if e in diff else 'X' for e in li1] 


>>> S
{0: ['X', 'X', 3, 4], 1: ['X', 6, 7, 'X', 9, 'X'], 2: [11, 12, 13, 14, 15]}

通過設置差異操作-您可以獲得第一個列表中的內容,但不能同時獲取:

>>> set([1,2,3,4]) - set([2,3,8])
{1, 4}

一旦知道這一點,就可以輕松地根據需要更改列表。

如果你想要一個列表列表,那么你可以使用理解:

LoL=[[e if e in set1 else 'X' for e in li1]
    for li1,set1 in 
        zip(S.values(), {k:set(li1)-set(R.get(k,[])) 
            for k,li1 in S.items()}.values())]

>>> LoL
[['X', 'X', 3, 4], ['X', 6, 7, 'X', 9, 'X'], [11, 12, 13, 14, 15]]

但恕我直言,循環更容易理解......

您可以使用字典理解:

F = {k: ["X" if vv in R.get(k, []) else vv for vv in v] for k, v in S.items()}
print(F)

印刷:

{0: ['X', 'X', 3, 4], 1: ['X', 6, 7, 'X', 9, 'X'], 2: [11, 12, 13, 14, 15]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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