情景假设:一个足球比赛中每个球员的名字和进球数保存在字典中如下所示
第一轮:{A: 2, B:1, C:1}
第二轮:{A: 2, C: 1, D:1, E: 1}
第三轮:{C:3, F: 3}
如何找出每轮都有进球的人
首先模拟数据
>>> from random import randint, sample
>>> g1 = {x: randint(1, 3) for x in sample('ABCDEFG', randint(2, 7))}
>>> g2 = {x: randint(1, 3) for x in sample('ABCDEFG', randint(2, 7))}
>>> g3 = {x: randint(1, 3) for x in sample('ABCDEFG', randint(2, 7))}
>>> g1
{'E': 2, 'G': 2}
>>> g2
{'F': 3, 'D': 1, 'A': 2, 'B': 2, 'G': 1}
>>> g3
{'C': 3, 'A': 2, 'F': 3, 'E': 2, 'D': 2, 'B': 3, 'G': 3}
利用字典的keys方法可以得到键的集合,再利用集合的交操作我们可以得到公共键
>>> g1.keys() & g2.keys() & g3.keys()
{'G'}
抽象解决这个问题的的算法,可以归为两种操作,一个是对每个集合取keys,另一种是两两求交集,于是map和reduce可以派上用场了
>>> from functools import reduce
>>> reduce(lambda x, y: x & y, map(lambda x: x.keys(), [m1, m2, m3]))
{'G'}