Предположим, у меня есть следующий вложенный словарь:
{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.






сначала вы хотите сгруппировать по «категории» (например, «ноги», «хвост», «мясо»), которая является ключом внутреннего словаря.
затем вы можете повторить новый словарь и вывести список результатов в желаемом формате:
from collections import defaultdict
in_dic = {"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"}}
result_by_category = defaultdict(list)
for animal, categories in in_dic.items():
for category, value in categories.items():
result_by_category[category].append((animal, value))
for category, values in result_by_category.items():
for animal, value in values:
print('{} {}: {}'.format(animal, category, value))
print('')
вывод точно:
Cow legs: thick
Goat legs: slenderCow tail: long
Goat tail: shortCow milk: good
Goat milk: okCow meat: alright
Goat meat: excellent
Fish meat: superbFish fins: yes
Fish bones: plenty
Вы можете сделать это, создав список с реорганизованными ключами/значениями, используя понимание:
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}")
...
Fish bones: plenty
Fish fins: yes
Cow legs: thick
Goat legs: slender
Cow meat: alright
Fish meat: superb
Goat meat: excellent
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