zoukankan      html  css  js  c++  java
  • 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'])
  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/shiyu404/p/5945161.html
Copyright © 2011-2022 走看看