У меня есть информация о связке разных предметов. Каждый элемент имеет свой словарь, заполненный информацией об этом элементе, и у меня есть более крупный словарь, в котором хранится каждый элемент. Однако у меня нет одинаковой информации для каждого элемента. Например, скажем, мои вещи - фрукты. Тогда структура выглядит следующим образом:найти все словари, у которых есть неопределенное количество определенных ключей
fruit = {}
fruit['apple'] = {'color': 'red', 'origin': 'Washington'}
fruit['banana'] = {'color': 'yellow'}
fruit['orange'] = {'color': 'orange', 'origin': 'Florida'}
Если я хочу, чтобы найти происхождение каждого плода, для которых он был определен, я делаю следующее:
fruits, origins = zip(* [(f, fruit[f]['origin']) for f in fruit.keys() if 'origin' in fruit[f]])
Это работает отлично. Он начинает становиться уродливым, когда я хочу найти каждый плод, который имеет как цвет, так и происхождение.
fruits, origins, colors = zip(* [(f, fruit[f]['origin'], fruit[f]['color']) for f in fruit.keys() if 'origin' in fruit[f] and 'color' in fruit[f]])
То, что я хотел бы сделать, это быть в состоянии написать общую функцию, которая будет выполнять это действие для любого количества указанных ключей. То есть я мог бы вызвать некоторую функцию под названием «определенный», в которой будет использоваться словарь словарей, ключ или список ключей в подъязыкальном словаре и вернуть все суб-словари, которые имеют определения для каждого из этих ключей, а также значения для каждого ключа.
fruits, origins = defined(fruit, ['origin'])
fruits, origins, colors = defined(fruit, ['origin', 'color'])
Я посмотрел на различных существующих потоков с вопросами о получении пар ключ/значение из или в словарях, но я все, что выглядит право не найдено. Есть ли простой способ обобщить это?
Или, если люди также хотят сказать мне, что я должен организовать свои данные совершенно по-другому, я бы тоже приветствовал это. Сначала я остановился на словаре словарей из-за широкого спектра информации, доступной для каждого элемента. Например, некоторые суб-словари содержат десятки записей с информацией, а некоторые элементы имеют только несколько записей (т. Е. Словарь «яблочный» содержит много информации, но я не так много хранил в «kumquat»).
Отлично, это сработало так, как я надеялся. Спасибо! – jdmcbr