![](/img/trans.png)
[英]Comparing values in one dictionary with values from another dictionary in Python
[英]Comparing and matching values in a dictionary by getting its values from a nested dictionary taking reference from another dictionary
我是 Python 的新手,我正在嘗試解決一個問題,但不知道如何繼續。 如有錯誤請見諒。 如果我的問題不清楚,你可以問我。 即使是關於如何進行的一個小想法也會有所幫助。
我有一個嵌套字典作為-
dicti = {0: {'Living': ['Tiger', 'Lion'],
'NonLiving': ['Table', 'Anything']},
1: {'Living': ['Dog', 'Animal'],
'NonLiving': ['Cup', 'Chair']},
2: {'Living': ['Crow', 'Pig'],
'NonLiving': ['Home', 'Desk']},
3: {'Living': ['Tiger', 'Lion'],
'NonLiving': ['Cup', 'Stationery']},
4: {'Living': ['Lion', 'Hen'],
'NonLiving': ['Eraser', 'Pen']},
5: {'Living': ['Animal', 'Bird'],
'NonLiving': ['Anything', 'Anything']},
6: {'Living': ['Bird', 'Shark'],
'NonLiving': ['Desk', 'Table']},
7: {'Living': ['Tiger', 'Fish'],
'NonLiving': ['Book', 'Stationery']},
8: {'Living': ['Crow', 'Pig'],
'NonLiving': ['Home', 'Table']},
9: {'Living': ['Anything', 'Animal'],
'NonLiving': ['Stationery', 'Eraser']},
10: {'Living': ['Fish', 'Anything'],
'NonLiving': ['Book', 'Chair']},
11: {'Living': ['Wolf', 'Dog'],
'NonLiving': ['Desk', 'Table']},
12: {'Living': ['Shark', 'Crow'],
'NonLiving': ['Chair', 'Home']}}
我有一本帶有所有項目標簽的字典 -
Labels = {'Tiger': '001',
'Pig': '002',
'Lion': '003',
'Dog': '004',
'Wolf': '004',
'Crow': '201',
'Hen': '203',
'Shark': '408',
'Whale': '405',
'Desk': '610',
'Table': '610',
'Chair': '719',
'Pen': '817',
'Book': '880',
'Eraser': '815',
'Tape': '525'}
請注意 - Dog、Wolf 和 Desk、Table 具有相同的 label 編號。
這些項目在另一個字典中分組為-
Groups = {'Fish': ['Shark', 'Whale'],
'Bird': ['Crow', 'Hen'],
'Animal': ['Tiger', 'Pig', 'Lion', 'Dog', 'Wolf'],
'Home': ['Desk', 'Chair', 'Table'],
'Stationery': ['Pen', 'Book', 'Eraser', 'Tape']}
請注意 - 組名稱代表組內所有項目的標簽。 即“魚”的標簽為 408,405。 同樣,“動物”的標簽為 001,002,003,004
我有另一本字典,我想在其中比較 dicti 字典中的項目-
Compare= {'Alpha': [[0, 1], [0, 3], [3, 4], [1, 2], [6, 12], [4, 5]],
'Beta': [[4, 6], [3, 4], [1, 5], [6, 10], [10, 12], [2, 8]],
'Gamma': [[0, 8], [7, 9], [3, 5], [1, 11], [1, 6], [1, 7], [5, 7]]}
“比較”中的數字 0,1,2,3...,12 是 dicti 字典中的鍵。 我想將這些對作為 [0,1] 進行比較,其中 0 與 1 進行比較; [0,3] 其中 0 與 3 進行比較,以此類推,用於比較中的所有項目。 比較將首先通過其在標簽中的值對列表“生活”的第一個元素進行比較,然后對列表“生活”的第二個元素進行比較。 如果 Living 匹配,則移動到列表 NonLiving 的第一個元素,然后是列表 NonLiving 的第二個元素。 每次在任何部分沒有匹配項時,都需要從“比較”中的列表中刪除該對。 例如:首先在比較 Living in Compare 中的第一個元素時,output 應該是-
Compare = {'Alpha': [[0, 3], [4, 5]],
'Beta': [[1, 5], [10, 12], [2, 8]],
'Gamma': [[3, 5], [1, 11], [5, 7]]}
請注意- [4,5] 保留在 Alpha 中並且沒有被刪除,因為這兩個鍵的第一個元素是“Lion”和“Animal”; 獅子屬於“組”詞典中的“動物”類別。 [1,5], [10,12] 按照相同的邏輯保持在 Beta 中。 [1,11] 保存在 Gamma 中,因為“標簽”字典中 Dog 和 Wolf 的值相同。
現在對於第二次迭代,在比較 Living 中的第二個元素時,必須從這個新的 Compare 中完成。 output 應該是-
Compare = {'Alpha': [[0, 3], [4, 5]],
'Beta': [[10, 12], [2, 8]],
'Gamma': [[1, 11]]}
請注意,Beta 中的 [10,12] 被保留而不是被刪除,因為它們在 Living 中的第二個元素是“Anything”和“Crow”。 'Anything' 值代表所有標簽。 因此,無論比較如何,它始終是匹配的。
同樣,在新的比較字典中的項目中,我們比較了“NonLiving”的第一個元素。 並刪除不匹配的對。 並通過更新它再次形成一個新的比較字典。 最后我們比較'NonLiving'鍵的第二個元素。 最終的 output 應該是-
Compare = {'Alpha': [[4, 5]],
'Beta': [[2, 8]],
'Gamma': ''}
您可以將filter
與自定義過濾器 function 一起使用:
dicti = {0: {'Living': ['Tiger', 'Lion'], 'NonLiving': ['Table', 'Anything']}, 1: {'Living': ['Dog', 'Animal'], 'NonLiving': ['Cup', 'Chair']}, 2: {'Living': ['Crow', 'Pig'], 'NonLiving': ['Home', 'Desk']}, 3: {'Living': ['Tiger', 'Lion'], 'NonLiving': ['Cup', 'Stationery']}, 4: {'Living': ['Lion', 'Hen'], 'NonLiving': ['Eraser', 'Pen']}, 5: {'Living': ['Animal', 'Bird'], 'NonLiving': ['Anything', 'Anything']}, 6: {'Living': ['Bird', 'Shark'], 'NonLiving': ['Desk', 'Table']}, 7: {'Living': ['Tiger', 'Fish'], 'NonLiving': ['Book', 'Stationery']}, 8: {'Living': ['Crow', 'Pig'], 'NonLiving': ['Home', 'Table']}, 9: {'Living': ['Anything', 'Animal'], 'NonLiving': ['Stationery', 'Eraser']}, 10: {'Living': ['Fish', 'Anything'], 'NonLiving': ['Book', 'Chair']}, 11: {'Living': ['Wolf', 'Dog'], 'NonLiving': ['Desk', 'Table']}, 12: {'Living': ['Shark', 'Crow'], 'NonLiving': ['Chair', 'Home']}}
Labels = {'Tiger': '001', 'Pig': '002', 'Lion': '003', 'Dog': '004', 'Wolf': '004', 'Crow': '201', 'Hen': '203', 'Shark': '408', 'Whale': '405', 'Desk': '610', 'Table': '610', 'Chair': '719', 'Pen': '817', 'Book': '880', 'Eraser': '815', 'Tape': '525'}
Groups = {'Fish': ['Shark', 'Whale'], 'Bird': ['Crow', 'Hen'], 'Animal': ['Tiger', 'Pig', 'Lion', 'Dog', 'Wolf'], 'Home': ['Desk', 'Chair', 'Table'], 'Stationery': ['Pen', 'Book', 'Eraser', 'Tape']}
Compare = {'Alpha': [[0, 1], [0, 3], [3, 4], [1, 2], [6, 12], [4, 5]], 'Beta': [[4, 6], [3, 4], [1, 5], [6, 10], [10, 12], [2, 8]], 'Gamma': [[0, 8], [7, 9], [3, 5], [1, 11], [1, 6], [1, 7], [5, 7]]}
def comp(a, b):
if 'Anything' in [a, b]:
return True
return ({Labels[a]} if a in Labels else {Labels.get(i, i) for i in Groups.get(a, [])})\
&({Labels[b]} if b in Labels else {Labels.get(i, i) for i in Groups.get(b, [])})
def valid_pair(pair):
[l1, l2], [l3, l4] = dicti[pair[0]]['Living'], dicti[pair[-1]]['Living']
if not comp(l1, l3) or not comp(l2, l4):
return False
[nl1, nl2], [nl3, nl4] = dicti[pair[0]]['NonLiving'], dicti[pair[-1]]['NonLiving']
return comp(nl1, nl3) and comp(nl2, nl4)
r = {a:k if (k:=[*filter(valid_pair, b)]) else '' for a, b in Compare.items()}
Output:
{'Alpha': [[4, 5]], 'Beta': [[2, 8]], 'Gamma': ''}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.