Пропуск словарей, содержащих определенные ключи

Я ищу хороший способ пропускать словари, содержащие определенные ключи, среди нескольких разных словарей.

Прямо сейчас я связываю методы .get() с объектом словаря и продолжаю работать со всеми совпадениями, что работает, но это немного грязно.

Я делаю что-то вроде:

...
if my_dict.get('some_key', my_dict.get('other_key', my_dict.get('some_other_key'))):
    continue

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете использовать any с выражением-генератором, которое перебирает возможные ключи и проверяет, есть ли в словаре какой-либо из ключей:

if any(key in my_dict for key in ('some_key', 'other_key', 'some_other_key')):
    continue

В качестве альтернативы вы можете использовать set.isdisjoint, чтобы проверить, не пересекается ли набор ключей с ключами dict:

if not {'some_key', 'other_key', 'some_other_key'}.isdisjoint(my_dict):
    continue

И, как указывает @deceze, вы также можете просто проверить, пересекается ли набор ключей с набором ключей dict, что выглядит более читабельно:

if {'some_key', 'other_key', 'some_other_key'}.intersection(my_dict):
    continue

Но имейте в виду, что в отличие от set.isdisjoint, set.intersection создает новый набор и не закорачивает первое совпадение, поэтому требует больше затрат как по времени, так и по пространству.

Вместо двойного отрицания not isdisjoint больше смысла имел бы просто intersection.

deceze 17.05.2024 10:12

@deceze intersection не замыкает накоротко.

blhsing 17.05.2024 10:12

Может быть и так, но это скорее микрооптимизация по сравнению с более понятным кодом, IMO.

deceze 17.05.2024 10:13

Это также без необходимости создает новый набор. Но конечно, могу добавить intersection в качестве примечания.

blhsing 17.05.2024 10:14

Похоже, ОП пытается проверить истинность значений этих ключей, а не наличие самих ключей. Этот ответ, кажется, предлагает последнее. Вам придется изменить его на if any(my_dict[key] for key in (....)) В качестве альтернативы рассмотрите второй ответ, отправленный с использованием map и any.

Darshan A S 17.05.2024 10:47

@DarshanAS Судя по формулировке «содержать» в описании цели ФП «пропускать словари, содержащие определенные ключи», я считаю, что ФП на самом деле хочет проверить наличие определенных ключей. Код ОП, использующий dict.get, работает только потому, что не существует словаря, содержащего ложные значения.

blhsing 17.05.2024 10:50

@bihsing Ах, возможно, ты прав. Описание проблемы ОП и фрагмент кода различаются. Я пропустил часть описания при ответе.

Darshan A S 17.05.2024 11:00

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