Python 比较嵌套字典中的多个键

Python 比较嵌套字典中的多个键,python,Python,假设我有以下嵌套字典: {Cow:{legs:thick, tail:long, milk:good, meat:alright}, Goat:{legs:slender, tail:short, milk:ok, meat:excellent}, Fish:{fins:yes, meat:superb, bones:plenty}} 我的目标是比较外部键(牛、山羊和鱼),并检查它们的内部键是否匹配。理想情况下,我应该: Cow legs: thick Goat legs: slender

假设我有以下嵌套字典:

{Cow:{legs:thick, tail:long, milk:good, meat:alright}, Goat:{legs:slender, tail:short, milk:ok, meat:excellent}, Fish:{fins:yes, meat:superb, bones:plenty}}
我的目标是比较外部键(牛、山羊和鱼),并检查它们的内部键是否匹配。理想情况下,我应该:

Cow legs: thick 
Goat legs: slender

Cow tail: long
Goat tail: short

Cow milk: good 
Goat milk: ok

Cow meat: alright
Goat meat: excelent
Fish meat: superb

Fish fins: yes
Fish bones: plenty
对我来说,问题是我还不知道如何在多个字典中比较内部键

我可以用传统方式解包嵌套的dict,如下所示:

for outerkeys, innerdicts in nestedDict:
      #but here I'm stuck on how to process multiple inner dictionaries
      #to extract matching (and unmatching) keys.

首先,您需要按照“类别”(例如“腿”、“尾巴”、“肉”)进行分组,这是内部字典的关键

然后,您可以迭代新字典,并以您希望的格式列出输出:

从集合导入defaultdict
在{“牛”:{“腿”:“粗”,“尾”:“长”,“奶”:“好”,“肉”:“好”},
“山羊”:{“腿”:“细长”,“尾巴”:“短”,“奶”:“好”,“肉”:“极好”},
“鱼”:{“鳍”:“是的”,“肉”:“极好”,“骨头”:“充足”}
结果按类别=默认目录(列表)
对于动物,目录项()中的类别:
对于类别,在categories.items()中输入值:
结果按类别[类别].追加((动物,值))
对于类别,结果按类别。项()中的值:
对于动物,价值中的价值:
打印(“{}{}:{}.”格式(动物、类别、值))
打印(“”)
输出为:

牛腿:粗
山羊腿:细长

牛尾:长
山羊尾巴:短

牛奶:好
羊奶:可以

牛肉:好的
羊肉:非常好
鱼肉:极好

鱼翅:是的

鱼骨:充足


首先,您需要按照“类别”(例如“腿”、“尾巴”、“肉”)进行分组,这是内部字典的关键

然后,您可以迭代新字典,并以您希望的格式列出输出:

从集合导入defaultdict
在{“牛”:{“腿”:“粗”,“尾”:“长”,“奶”:“好”,“肉”:“好”},
“山羊”:{“腿”:“细长”,“尾巴”:“短”,“奶”:“好”,“肉”:“极好”},
“鱼”:{“鳍”:“是的”,“肉”:“极好”,“骨头”:“充足”}
结果按类别=默认目录(列表)
对于动物,目录项()中的类别:
对于类别,在categories.items()中输入值:
结果按类别[类别].追加((动物,值))
对于类别,结果按类别。项()中的值:
对于动物,价值中的价值:
打印(“{}{}:{}.”格式(动物、类别、值))
打印(“”)
输出为:

牛腿:粗
山羊腿:细长

牛尾:长
山羊尾巴:短

牛奶:好
羊奶:可以

牛肉:好的
羊肉:非常好
鱼肉:极好

鱼翅:是的

鱼骨:充足


您可以使用以下方法构建一个包含重新组织的键/值的列表:

animals = {"Cow": {"legs": "thick", "tail": "long", "milk": "good", "meat": "alright"},
          "Goat": {"legs": "slender", "tail": "short", "milk": "ok", "meat": "excellent"},
          "Fish": {"fins": "yes", "meat": "superb", "bones": "plenty"}}

triples   = [(trait,animal,value) for animal,traits in animals.items() for trait,value in traits.items()]

lineBreak = {min(triples)[0]}
for trait,animal,value in sorted(triples):
    if not(trait in lineBreak or lineBreak.add(trait)): print("")
    print(f"{animal} {trait}: {value}")


您可以使用以下方法构建一个包含重新组织的键/值的列表:

animals = {"Cow": {"legs": "thick", "tail": "long", "milk": "good", "meat": "alright"},
          "Goat": {"legs": "slender", "tail": "short", "milk": "ok", "meat": "excellent"},
          "Fish": {"fins": "yes", "meat": "superb", "bones": "plenty"}}

triples   = [(trait,animal,value) for animal,traits in animals.items() for trait,value in traits.items()]

lineBreak = {min(triples)[0]}
for trait,animal,value in sorted(triples):
    if not(trait in lineBreak or lineBreak.add(trait)): print("")
    print(f"{animal} {trait}: {value}")


您也可以尝试使用
grouby

from itertools import groupby
from operator import itemgetter

nested_dict = {
    "Cow": {"legs": "thick", "tail": "long", "milk": "good", "meat": "alright"},
    "Goat": {"legs": "slender", "tail": "short", "milk": "ok", "meat": "excellent"},
    "Fish": {"fins": "yes", "meat": "superb", "bones": "plenty"},
}

refactored_items = (
    (k1, k2, v2) for k1, v1 in nested_dict.items() for k2, v2 in v1.items()
)
sorted_refactored_items = sorted(refactored_items, key=itemgetter(1))
for _, g in groupby(sorted_refactored_items, key=itemgetter(1)):
    print("\n".join(f"{a} {b}: {c}" for a, b, c in g))
    print("")
输出:

Fish bones: plenty

Fish fins: yes

Cow legs: thick
Goat legs: slender

Cow meat: alright
Goat meat: excellent
Fish meat: superb

Cow milk: good
Goat milk: ok

Cow tail: long
Goat tail: short

您也可以尝试使用
grouby

from itertools import groupby
from operator import itemgetter

nested_dict = {
    "Cow": {"legs": "thick", "tail": "long", "milk": "good", "meat": "alright"},
    "Goat": {"legs": "slender", "tail": "short", "milk": "ok", "meat": "excellent"},
    "Fish": {"fins": "yes", "meat": "superb", "bones": "plenty"},
}

refactored_items = (
    (k1, k2, v2) for k1, v1 in nested_dict.items() for k2, v2 in v1.items()
)
sorted_refactored_items = sorted(refactored_items, key=itemgetter(1))
for _, g in groupby(sorted_refactored_items, key=itemgetter(1)):
    print("\n".join(f"{a} {b}: {c}" for a, b, c in g))
    print("")
输出:

Fish bones: plenty

Fish fins: yes

Cow legs: thick
Goat legs: slender

Cow meat: alright
Goat meat: excellent
Fish meat: superb

Cow milk: good
Goat milk: ok

Cow tail: long
Goat tail: short