>>> mysets = (set(x.items()) for x in MyList)
>>> reduce(lambda a,b: a.intersection(b), mysets)
set([('sum', '-21,90'), ('type', 'Purchase'), ('target', 'Apple Store')])
Сначала я создал генератор, который преобразует список диктов в итеративную последовательность наборов пар ключ-значение. Вы можете использовать понимание списка здесь, но этот способ не преобразует весь список в еще один список, полезно, если вы не знаете, насколько он будет большим.
Затем я использовал метод Reduce, чтобы применить функцию, которая находит общие значения для каждого набора. Он находит пересечение набора 1 и набора 2, который сам по себе является набором, затем пересечение этого набора и набора 3 и т. Д. Генератор mysets будет с радостью передавать каждый набор по требованию в функцию сокращения до тех пор, пока это не будет сделано.
Я считаю, что Reduce устарело как встроенное в Python 3.0, но все еще должно быть доступно в functools.
Вы, конечно, могли бы сделать его однострочным, заменив mysets в редуцировании выражением генератора, но это снижает читабельность IMO. На практике я бы, вероятно, даже пошел бы еще дальше и разбил бы лямбду на собственную линию:
>>> mysets = (set(x.items()) for x in MyList)
>>> find_common = lambda a,b: a.intersection(b)
>>> reduce(find_common, mysets)
set([('sum', '-21,90'), ('type', 'Purchase'), ('target', 'Apple Store')])
И если вам нужен конечный результат, чтобы быть диктатом, просто оберните его так:
>>> dict(reduce(find_common, mysets))
{'sum': '-21,90', 'type': 'Purchase', 'target': 'Apple Store'}
dict может принять любой итератор пар ключ-значение, например, набор кортежей, возвращаемых в конце.