#python #python-3.x #dictionary #set
#python #python-3.x #словарь #установить
Вопрос:
У меня много словарей:
dicts = [{'a': 1, 'b': 2, 'c': 1, 'd': 8}, {'c': 4, 'b': 3}, {'a': 9, 'b': 14}, ...]
Я хочу выяснить, какие ключи у них общие.
Итак, f(dicts) == {'b'}
в этом случае.
Я предполагал
set.intersection(*map(dict.keys, dicts))
Будет работать, но я получаю сообщение об ошибке
TypeError: descriptor 'intersection' for 'set' objects doesn't apply to a 'dict_keys' object
Похоже dict.keys
, что возвращает dict_keys
объект, который set.intersection
отказывается обрабатывать.
Есть ли столь же краткий способ получить коллективное пересечение некоторых dict_keys
? Или я вынужден reduce
с amp;
?
import functools
set(functools.reduce(lambda a, b: a amp; b, map(dict.keys, dicts)))
Комментарии:
1. Разве вы не должны иметь возможность сопоставлять с помощью sth like
lambda x: set(x.keys())
? Не удается протестировать rn2. Может
set.intersection(*[set(d) for d in dicts])
быть, илиset.intersection(*map(set, dicts))
3. @MarkMeyer очень приятно! Спасибо. Хотите сделать это ответом?
Ответ №1:
Вы можете преобразовать dicts непосредственно в set
s вместо dict_keys
объектов, которые затем могут быть переданы set.intersetcion()
:
dicts = [{'a': 1, 'b': 2, 'c': 1, 'd': 8}, {'c': 4, 'b': 3}, {'a': 9, 'b': 14}]
set.intersection(*map(set, dicts))
# {'b'}