簡體   English   中英

通過從嵌套字典中獲取值來比較和匹配字典中的值,並從另一個字典中引用

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

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