您的位置:首页 > 编程语言 > Python开发

python【5】如何快速找到多个字典中的公共键

2018-01-15 15:10 330 查看
案例 :在赛事统计中,经常需要知道每一轮中都有得分的运动员。

比如第一场中,使用字典来统计队员和得分情况 d1={'a':3.'b':4,'c':3,'d':2},仅仅记录有得分的运动员,得分为0 不记录。 

第二场 d2={'a':3.'b':4,'c':3,'d':2.'e':1}

第三场 d3={'b':4,'c':3,'d':2}

比如在这三场比赛中,统计每场都有进球的球员 ,在数据量不大的情况下,很容易肉眼分出来,但是当数量量大,多名球员时,使用循环的方法。从d1 中选取键,与其他的字典的键进行比较,有相同的值就放到新的列表---记录每轮都有得分的列表。

首先生成一个表示球员得分的随机字典 

{'a':3.'b':4,'c':3,'d':2.'e':1}  使用random函数 {k:randint(1.7) for k in 'abcdefg'} 如果这样写生成的随机字典
,那么每一个字典中代表球员姓名的键值abcdefg 都会出现 ,此时使用sample函数,在给出的值中随机取样,这样就不会全部取出来

random.sample
random.sample(sequence, k),从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列  


from random import randint,sample

{k:randint(1,6) for k in sample('abcdefghijk',randint(3,8)} #在序列‘abcdefghijk’中随机取样3-8个

代码如下,使用迭代。



现在是使用循环迭代的方法,针对的是字典个数不多,但是当字典个数很多  及时几百的时候 也要挨个判断,这就不是很现实,输入也复杂,现在便引入几个方便的函数  使用集合的交集来操作。

使用字典的keys()得到一个字典的keys的集合;
使用map函数,得到所有字典的keys的集合;
使用reduce函数,取得所有字典的keys的集合的交集。
dict.keys()是获取字典的键值作为一个集合 



在3.5版本中 这方法并不正确 ,无法得到字典的键的集合  
3.5版本使用viewkeys方法是不可以的 ,只可以使用keys 可以得到,不过在2.7版本中,viewkeys和keys 方法均可得到字典的键的集合。推荐使用dict.keys()方法。



map()、filter()、reduce()这三个都是应用于序列的内置函数。 

map() 会根据提供的函数对指定序列做映射。

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

利用map函数是得到所有字典的键的集合。

语法为 :map(function,iterable) 即map(dict.keys(),[d1,d2,d3,d4,d5,d6....dn]),-----就是在序列d1到dn中取出字典的键,放到新的序列中。
reduce()

reduce() 函数会对参数序列中元素进行累积。

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。如



在这里例子中 使用reduce函数 #这里需要注意一个地方,使用的是3.5版本,reduce函数需要通过导入functools这个类来使用(from functools import reduce),直接使用reduce是不可以的 会报错:name 'reduce' is not defined

对取到的所有字典的键去交集。

 reduce(lambda a,b:参数的运算方法,[所操作的序列])

reduce(lambda a,b:a&b,map[dict.keys,[d1,d2,d3]])

代码如下 :



和使用迭代的方法是一样的 ,使用reduce和map的方法  适用于字典个数很多的情况。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: