【问题标题】:Comparing and matching values in a dictionary by getting its values from a nested dictionary taking reference from another dictionary通过从嵌套字典中获取值来比较和匹配字典中的值,并从另一个字典中引用
【发布时间】:2021-04-24 16:31:51
【问题描述】:

我是 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 的标签编号相同。

项目在另一个字典中分组为-

Groups = {'Fish': ['Shark', 'Whale'],
          'Bird': ['Crow', 'Hen'],
          'Animal': ['Tiger', 'Pig', 'Lion', 'Dog', 'Wolf'],
          'Home': ['Desk', 'Chair', 'Table'],
          'Stationery': ['Pen', 'Book', 'Eraser', 'Tape']}

请注意,组名代表组内所有项目的标签。即“鱼”的标签为 408,405。同样,“Animal”的标签为 001,002,003,004

我有另一本字典,我想比较字典中的项目-

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”的第一个元素按标签中的值逐一进行比较,然后对列表“Living”的第二个元素进行比较。如果 Living 匹配,则移动到列表 NonLiving 的第一个元素,然后是列表 NonLiving 的第二个元素。每次在任何部分没有匹配项时,都需要从“比较”中的列表中删除该对。 例如: 首先在比较 Living in Compare 中的第一个元素时,输出应该是-

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 = {'Alpha': [[0, 3], [4, 5]],
           'Beta': [[10, 12], [2, 8]],
           'Gamma': [[1, 11]]}

请注意- [10,12] 在 Beta 中被保留而不是被删除,因为它们在 Living 中的第二个元素是“Anything”和“Crow”。 'Anything' 值代表所有标签。因此,无论比较如何,它始终是匹配的。

类似地,在新的比较字典中的项目中,我们比较了“NonLiving”的第一个元素。并删除不匹配的对。并通过更新它再次形成一个新的比较字典。最后我们比较'NonLiving'键的第二个元素。 最终输出应该是-

Compare = {'Alpha': [[4, 5]],
           'Beta': [[2, 8]],
           'Gamma': ''}

【问题讨论】:

    标签: python list dictionary nested compare


    【解决方案1】:

    您可以将filter 与自定义过滤功能一起使用:

    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()}
    

    输出:

    {'Alpha': [[4, 5]], 'Beta': [[2, 8]], 'Gamma': ''}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多