微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过从另一个字典中获取引用的嵌套字典中的值来比较和匹配字典中的值

如何解决通过从另一个字典中获取引用的嵌套字典中的值来比较和匹配字典中的值

我是 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','Stationery']},4: {'Living': ['Lion','Hen'],'NonLiving': ['Eraser','Pen']},5: {'Living': ['Animal','Bird'],'NonLiving': ['Anything',6: {'Living': ['Bird','Shark'],'NonLiving': ['Desk','Table']},7: {'Living': ['Tiger','Fish'],'NonLiving': ['Book',8: {'Living': ['Crow',9: {'Living': ['Anything','NonLiving': ['Stationery','Eraser']},10: {'Living': ['Fish','Anything'],11: {'Living': ['Wolf','Dog'],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','Animal': ['Tiger','Pig','Lion','Dog','Wolf'],'Home': ['Desk','Chair','Table'],'Stationery': ['Pen','Book','Eraser','Tape']}

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

我有一个字典,我想在其中比较 dicti 字典中的项目-

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

请注意—— [4,5] 保留在 Alpha 中并且不会被删除,因为这两个键的第一个生存元素是“Lion”和“Animal”;狮子属于“组”词典中的“动物”类别。 [1,12] 遵循相同的逻辑仍处于 Beta 版。 [1,11] 保留在 Gamma 中,因为 'Labels' 字典中 Dog 和 Wolf 的值相同。

现在进行第二次迭代,同时比较 Living 中的第二个元素, 它必须从这个新的比较中完成。输出应该是-

Compare = {'Alpha': [[0,'Beta': [[10,'Gamma': [[1,11]]}

请注意—— [10,12] 在 Beta 中被保留并且不会被移除,因为它们在 Living 中的第二个元素是“任何东西”和“乌鸦”。值“Anything”代表所有标签。因此,无论进行何种比较,它都将始终匹配。

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

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

解决方法

您可以将 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','Stationery']},4: {'Living': ['Lion','Hen'],'NonLiving': ['Eraser','Pen']},5: {'Living': ['Animal','Bird'],'NonLiving': ['Anything',6: {'Living': ['Bird','Shark'],'NonLiving': ['Desk','Table']},7: {'Living': ['Tiger','Fish'],'NonLiving': ['Book',8: {'Living': ['Crow',9: {'Living': ['Anything','NonLiving': ['Stationery','Eraser']},10: {'Living': ['Fish','Anything'],11: {'Living': ['Wolf','Dog'],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','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],5],10],[10,[2,8]],'Gamma': [[0,8],[7,9],11],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,'Beta': [[2,'Gamma': ''}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。