zoukankan      html  css  js  c++  java
  • Python-找字典中公共key-zip reduce lambda

    场景实例:

           西班牙足球联赛,每轮球员进球统计:

           第一轮:{’1’:1,‘2’:4,‘5’:2,‘7’:3}

      第一轮:{’2’:1,‘5’:4,‘6’:2,‘3’:3}

           第一轮:{’1’:1,‘4’:4,‘6’:2,‘7’:3}

           ……

           问题:统计前N轮,都进球的球员?

    如何解决这个问题呢?

           方法1:

    #!/usr/bin/python3
    
    from random import randint, sample
    
    
    def get_s(player):
        # 获得三个赛季的随机记录
        s1 = {k: randint(1, 6) for k in sample(player, randint(3, 6))}
        s2 = {k: randint(1, 6) for k in sample(player, randint(3, 6))}
        s3 = {k: randint(1, 6) for k in sample(player, randint(3, 6))}
        return s1, s2, s3
    
    
    def public_keys(s1, s2, s3):
        # 定义中间列表
        median = []
        
        # 判断字典公共key,在s1,在s2,在s3肯定是公共key
        for key in s1:
            if key in s2 and key in s3:
                median.append(key)
        return median
    
    if __name__ == '__main__':
        # 生成abcdef个球员
        player = 'abcdef'
        
        # 获得3个赛季的随机数
        s1, s2, s3 = get_s(player)
        
        # 获取3个赛季都进球的球员
        result = public_keys(s1,s2,s3)
        print(result)

           方法2:

                  进球的球员都是数据中的key,通过求出每一轮的keys,然后做个交集就可以求出结果

    #!/usr/bin/python3
    
    from random import randint, sample
    
    
    def get_s(player):
        # 获得三个赛季的随机记录
        s1 = {k: randint(1, 6) for k in sample(player, randint(3, 6))}
        s2 = {k: randint(1, 6) for k in sample(player, randint(3, 6))}
        s3 = {k: randint(1, 6) for k in sample(player, randint(3, 6))}
        return s1, s2, s3
    
    
    def public_keys(s1, s2, s3):
        # 返回各字典的单边值,并求出交集,即是结果
        return s1.keys() & s2.keys() & s3.keys()
    
    if __name__ == '__main__':
        # 生成abcdef个球员
        player = 'abcdef'
        
        # 获得3个赛季的随机数
        s1, s2, s3 = get_s(player)
        
        # 获取3个赛季都进球的球员
        result = public_keys(s1, s2, s3)
        print(result)

      方法3:

             当N轮时候,通过map和reduce函数

    #!/usr/bin/python3
    
    from random import randint, sample
    from functools import reduce
    
    
    def get_s(player):
        # 获得三个赛季的随机记录
        s1 = {k: randint(1, 6) for k in sample(player, randint(3, 6))}
        s2 = {k: randint(1, 6) for k in sample(player, randint(3, 6))}
        s3 = {k: randint(1, 6) for k in sample(player, randint(3, 6))}
        return s1, s2, s3
    
    
    def public_keys(s1, s2, s3):
        result = reduce(lambda a, b: a & b, map(dict.keys, [s1, s2, s3]))
        # map(dict. keys,[s1,s2,s3,......N] 获得每轮的keys集合,s1……N为字典对象
        # reduce((lamda a,b: a&b,map())     把map获得的集合,依次放入a,b,返回交集
        # a,b = a&b, map中取出的一个值map(dict.keys, [s1, s2, s3])取得新的列表
        # reduce中的lambda只能传入两个参数
        # map 为高阶函数,接收一个map(函数, [参数]),迭代参数列表,一个传入函数中处理,返回处理结果变成新的列表
        
        return result
    
    if __name__ == '__main__':
        # 生成abcdef个球员
        player = 'abcdef'
        
        # 获得3个赛季的随机数
        s1, s2, s3 = get_s(player)
        
        # 获取3个赛季都进球的球员
        result = public_keys(s1, s2, s3)
        print(result)

     

  • 相关阅读:
    Mac 删除Openfire
    FMDB使用
    豆瓣restful api 状态和错误码
    豆瓣开放api
    常用文字配色方案
    电商网站参考
    HP后端跨域HEADER头
    PHP统计 图表实现方法
    PHP 全过程教程和测试网
    Ajax技术在购物车中的应用(PHP篇)
  • 原文地址:https://www.cnblogs.com/2bjiujiu/p/7236962.html
Copyright © 2011-2022 走看看