Сравнение нескольких ключей во вложенном словаре

Предположим, у меня есть следующий вложенный словарь:

{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.
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

сначала вы хотите сгруппировать по «категории» (например, «ноги», «хвост», «мясо»), которая является ключом внутреннего словаря.

затем вы можете повторить новый словарь и вывести список результатов в желаемом формате:

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: slender

Cow tail: long
Goat tail: short

Cow milk: good
Goat milk: ok

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

Fish 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

Другие вопросы по теме