пересечение нескольких ключей словаря

#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()) ? Не удается протестировать rn

2. Может 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'}