首页 > 代码库 > Python强化训练笔记(五)——找出多个字典中的公共键

Python强化训练笔记(五)——找出多个字典中的公共键

技术分享

在这个问题中,我们期望得到的结果是找到这三轮比赛中,每轮都进球的球员都有谁。下面用python来模拟一下,先生成一批数据:

>>> from random import randint, sample>>> # sample是取样的意思,例如sample(‘abcde‘, 2),会在‘abcde‘这个字符串中随机抽样2个字符出来>>> {x: randint(1,3) for x in sample(abcdef, randint(3, 6))}{a: 2, b: 2, e: 2, d: 3, f: 2}>>> # 利用上面的方法生成3轮比赛的数据>>> s1 = {x: randint(1,3) for x in sample(abcdef, randint(3, 6))}>>> s2 = {x: randint(1,3) for x in sample(abcdef, randint(3, 6))}>>> s3 = {x: randint(1,3) for x in sample(abcdef, randint(3, 6))}>>> # 观察s1,s2,s3>>> s1{a: 2, b: 4, f: 1}>>> s2{a: 4, b: 3, e: 2, d: 4, g: 3, f: 4}>>> s3{a: 3, b: 4, e: 2, d: 2, f: 1}

如上代码所示我们生成了三轮比赛的数据,想要得到三轮比赛中,哪位球员在每轮比赛都进球,有这么几种方法:

一. 遍历

>>> res = []>>> for x in s1:>>>     if x in s2 and x in s3:>>>         res.append()>>> res[a, b, f]

这种方法效率不高,并且笨重

二. 与运算

>>> s1.viewkeys()dict_keys([a, b, f])>>> s2.viewkeys()dict_keys([a, b, e, d, g, f])>>> s3.viewkeys()dict_keys([a, b, e, d, f])>>> s1.viewkeys() & s2.viewkeys() & s3.viewkeys()set([a, b, f])

与运算清晰明了,利用了set集合的元素不重复性质。

三. map与reduce

其实我们利用与运算已经可以比较方便的得到公共键了,但是这个问题有一个延伸,如果不止3轮呢?假如有很多很多,或者未知轮(s1,s2,s3...sn),这时就需要引入map和reduce函数了。

这里只对两个函数进行简要介绍,并不完全。

map(f, list)函数接受两个必要参数,函数f和列表list,返回一个list,该list内的所有元素是参数list中所有元素按照函数f进行计算后的结果。例如:

>>> l = [1,2,3,4,5]>>> map(lambda x: x*x, l)[1,4,9,16,25]

reduce(f, list)函数与map类似,其参数f函数接收两个参数,并且返回的list内的所有元素是参数list中所有元素按照函数f进行累计计算后的结果,例如累加/累乘:

>>> l = [1,2,3,4,5]>>> reduce(lambda x,y: x+y, l)15>>> reduce(lambda x,y: x*y, l)120

 

那么利用这两个函数,在配合与运算,可以完美解决这个问题:

>>> map(dict.viewkeys, [s1, s2, s3])[dict_keys([a, b, f]), dict_keys([a, b, e, d, g, f]), dict_keys([a, b, e, d, f])]>>> reduce(lambda x,y: x&y, map(dict.viewkeys, [s1, s2, s3]))set([a, b, f])

 

Python强化训练笔记(五)——找出多个字典中的公共键