未加星标

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

字体大小 | |
[开发(python) 所属分类 开发(python) | 发布者 店小二05 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

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)相关术语:python基础教程 python多线程 web开发工程师 软件开发工程师 软件开发流程

主题: Python数据其实抽样
分页:12
转载请注明
本文标题:Python强化训练笔记(五)――找出多个字典中的公共键
本站链接:http://www.codesec.net/view/480881.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 开发(python) | 评论(0) | 阅读(40)