Чтобы получить пересечение:
dict(reduce(lambda x, y: x & y, map(set, map(lambda x: x.iteritems(), dicts))))
Конечно, это отбрасывает уникальные значения, поэтому нам нужно получить дополнение:
dict(reduce(lambda x, y: x - y, map(set, map(lambda x: x.iteritems(), dicts))))
Объединение полученных словарей дает нам результатset:
def dict_intersection(d):
x = dict(reduce(lambda x, y: x & y, map(set, map(lambda x: x.iteritems(), dicts))))
y = dict(reduce(lambda x, y: x - y, map(set, map(lambda x: x.iteritems(), dicts))))
return dict(x.items() + y.items())
Если бы мой сет фу был сильнее, я мог бы поставить его на один лайнер, но не сегодня, как кажется.