Этот вопрос задан this question. Я хотел бы получить словарь из списка словарей, который должен содержать все пары ключ/значение из всех словарей, которые либо содержатся только один раз, либо где все словари согласуются с соответствующим значением. Пример (из вышеупомянутой публикации):Создайте словарь непротиворечивых предметов из списка словарей
dicts = [dict(a=3, b=89, d=2), dict(a=3, b=89, c=99), dict(a=3, b=42, c=33)]
print dict_itersection(dicts)
должны давать
{'a': 3, 'd': 2}
Моя текущая реализация выглядит следующим образом:
import collections
def dict_intersection(dicts):
c=collections.defaultdict(set)
for d in dicts:
for a, b in d.iteritems():
c[a].add(b)
return {a: next(iter(b)) for a, b in c.iteritems() if len(b) == 1}
Так что мой вопрос: Можно ли это сделать элегантнее ?
Sidequestion: может next(iter(b))
быть сделано лучше без модификации базового словаря (т.е. не b.pop()
)?
Все, что нужно, это два комментария. 'b.pop()' будет здесь отлично, поскольку он только изменяет ваши новые временные множества. Нет другого способа получить один элемент из набора. потому что у наборов нет порядка и, следовательно, нет 'myset [0]' –