在这个问题中,我们期望得到的结果是找到这三轮比赛中,每轮都进球的球员都有谁。下面用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强化训练笔记(五)——找出多个字典中的公共键的更多相关文章

  1. python实例:快速找出多个字典中的公共键

    1.生成随机字典 # 从abcdefg 中随机取出 3-6个,作为key, 1-4 的随机数作为 value s1 = {x : randint(1, 4) for x in sample('abcd ...

  2. Python强化训练笔记(一)——在列表,字典,集合中筛选数据

    列表,字典,集合中根据条件筛选数据,如下所示 列表:[-10,2,2,3,-2,7,6,9] 找出所有的非负数 字典:{1:90,2:55,3:87...} 找出所有值大于60的键值对 集合:{2,3 ...

  3. Python强化训练笔记(六)——让字典保持有序性

    python的字典是一个非常方便的数据结构,使用它我们可以轻易的根据姓名(键)来找到他的成绩,排名等(值),而不用去遍历整个数据集. 例如:{'Lee': [1, 100], 'Jane': [2, ...

  4. Python强化训练笔记(七)——使用deque队列以及将对象保存为文件

    collections模块中的deque对象是一个队列,它有着正常队列的先进先出原则.我们可以利用这个对象来实现数据的保存功能. 例如,现有一个猜数字大小的游戏,系统开始会随机roll点一个0-100 ...

  5. Python强化训练笔记(四)——字典的排序

    假如有学生成绩以字典顺序排列:{'Tom': 87, 'Jack': 90, 'Rose': 100.....} 想要根据学生的成绩来进行排序,可以考虑使用sorted函数.但是sorted函数用在字 ...

  6. Python强化训练笔记(三)——词频的统计

    现有列表如下: [6, 7, 5, 9, 4, 1, 8, 6, 2, 9] 希望统计各个元素出现的次数,可以看作一个词频统计的问题. 我们希望最终得到一个这样的结果:{6:2, 7:1...}即 { ...

  7. Python强化训练笔记(二)——元组元素的命名

    对于一个元组如: >>> s1 = ('Jim', 21, 'boy', '5788236@qq.com') 我们要得到该对象的名字,年龄,性别及邮箱的方法为s1[0],s1[1], ...

  8. python数据结构-如何快速找到多个字典中的公共键

    如何快速找到多个字典中的公共键 问题举例 统计每轮都进球的球员: 第1轮{‘tom’:1, 'meixi':2} 第2轮{‘coco’:3, 'meixi':4, 'marton':2} 第3轮{'c ...

  9. 如何快速查找到多个字典中的公共键(Key)---Python数据结构与算法相关问题与解决技巧

    如何快速查找到多个字典中的公共键(Key)-?   实际案例: 西班牙足球甲级联赛,每轮球员进球统计: 第1轮: { '苏亚雷斯':1,'梅西':2,'本泽马':1,...} 第2轮: { '苏亚雷斯 ...

随机推荐

  1. Ubuntu 使用phpmyadmin,报错#1146 - Table ‘phpmyadmin.pma_table_uiprefs' doesn't exist

    cd /etc/phpmyadminsudo vim config.inc.php 修改phpmyadmin的配置文件config.inc.php $cfg['Servers'][$i]['table ...

  2. 【转】Spring mvc集成ZBUS--轻量级MQ、RPC、服务总线

    本文转自:http://www.cnblogs.com/top15from/p/4899954.html ZBUS = MQ + RPC + PROXY 支持消息队列, 发布订阅, RPC, 代理(T ...

  3. asp.net中membership使用oracle数据库(二)

    需要安装的东西都准备好了,继续生成后台表.过程.函数.触发器等.ps/sql中 @@E:\oracle\product\11.2.0\client_1\ASP.NET\SQL\InstallAllOr ...

  4. vim 使用

    vim有三种模式:输入模式,命令模式,底行模式,使用esc进入命令模式,在命令模式下按英文的冒号,进入底行模式:命令行模式下按i进入输入模式.vim编辑文件是将文件内容复制到缓冲区显示在屏幕上. vi ...

  5. iOS根据16进制的色号来设置颜色,适合封装工具类

    iOS中有时候UI给的一个色号就像 #54e1b7 这个,而我们一般设置颜色都是根据RBG来设置的,所以这里需要把这个16进制的色号转为RGB值,这里我们就使用一下的方法来调用设置颜色. + (UIC ...

  6. 简述Linux命令初使用

    .cd 命令 cd 命令经常使用来改变目录 root@test:~# cd /home/user/Desktop root@test:~# cd .. 返回上一级目录 root@test:~# cd ...

  7. 拉风的服务器监控工具,随时掌握服务器动态,AgileEAS.NET SOA 平台服务器监控工具集介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  8. 常见开发需求之angular上拉加载更多

    需求   移动端使用angular实现上拉加载更多的条目,这个需求比较常见,网上的插件改动起来比较麻烦,不如自己写一个最适合,以前有同事写了一个,奈何bug太多,后来改分页了,我们产品说什么都让做,没 ...

  9. freemarker内置函数和用法

    原文链接:http://www.iteye.com/topic/908500 在我们应用Freemarker 过程中,经常会操作例如字符串,数字,集合等,却不清楚Freemrker 有没有类似于Jav ...

  10. OOP: One pont of view of OOP与基于算法设计的区别

    ..摘自<C++网络编程 卷1:运用ACE和模式消除复杂性> <C++ Network Programming Volume 1 Mastering Complexity with ...