• 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'])
  • 相关阅读:
    你应该掌握的——树和二叉树
    nyist oj 63(二叉树)
    非递归遍历二叉树的四种策略先序、中序、后序和层序
    学习的四种境界
    nyist oj 467 (中缀式变后缀式)
    二叉平衡树
    nyist OJ 35 (表达式求值)
    线索二叉树
    二叉树的三种遍历方法(递归和非递归)
    算法学习之路
  • 原文地址:https://www.cnblogs.com/shiyu404/p/5945161.html
Copyright © 2020-2023  润新知