Я ищу хороший способ пропускать словари, содержащие определенные ключи, среди нескольких разных словарей.
Прямо сейчас я связываю методы .get() с объектом словаря и продолжаю работать со всеми совпадениями, что работает, но это немного грязно.
Я делаю что-то вроде:
...
if my_dict.get('some_key', my_dict.get('other_key', my_dict.get('some_other_key'))):
continue






Вы можете использовать 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 создает новый набор и не закорачивает первое совпадение, поэтому требует больше затрат как по времени, так и по пространству.
@deceze intersection не замыкает накоротко.
Может быть и так, но это скорее микрооптимизация по сравнению с более понятным кодом, IMO.
Это также без необходимости создает новый набор. Но конечно, могу добавить intersection в качестве примечания.
Похоже, ОП пытается проверить истинность значений этих ключей, а не наличие самих ключей. Этот ответ, кажется, предлагает последнее. Вам придется изменить его на if any(my_dict[key] for key in (....)) В качестве альтернативы рассмотрите второй ответ, отправленный с использованием map и any.
@DarshanAS Судя по формулировке «содержать» в описании цели ФП «пропускать словари, содержащие определенные ключи», я считаю, что ФП на самом деле хочет проверить наличие определенных ключей. Код ОП, использующий dict.get, работает только потому, что не существует словаря, содержащего ложные значения.
@bihsing Ах, возможно, ты прав. Описание проблемы ОП и фрагмент кода различаются. Я пропустил часть описания при ответе.
Вместо двойного отрицания
not isdisjointбольше смысла имел бы простоintersection.