zoukankan      html  css  js  c++  java
  • 找到最大或最小的N个值

    对于python原生的数据类型来说,并不存在直接的方法可以找到最大或最小的N个值,

    传统的方法必须先排序,然后再截取相应的值,而且对于集合这类数据类型来说还不能直接排序,

    需要先转化为列表才行,有的时候非常不便,因此python提供了内置模块heapq可以解决这类问题。

    下面分别对列表、集合和字典的角度解决这个需求。

    1.列表

    #列表
    nums = [45,12,4,-5.34,23,76,85,-15,56]
    
    # (1)传统方法
    nums2 = nums[:]
    nums2.sort()
    print(nums2[-3:]) #[56, 76, 85]
    
    # (2)引入库heapq
    #取最大的三个值
    print(heapq.nlargest(3,nums))
    #结果[85, 76, 56]
    print(heapq.nsmallest(3,nums)) #[-15, -5.34, 4]

    2.集合

    #集合
    set1 = {45,12,4,-5,34,23,76,85,-15,56}
    # (1)传统方法
    #由于集合不能排序,因此需要先将集合转化为列表
    list1 = list(set1)
    list1.sort()
    print(list1[-3:])  #[56, 76, 85]
    
    #(2)更时尚的方法
    print(heapq.nlargest(3,set1))  #[85, 76, 56]
    print(heapq.nsmallest(3,set1))  #[-15, -5, 4]

    3.字典

    #字典
    names = [
        {"name":"科比","age":26},
        {"name":"大姚","age":38},
        {"name":"丁同","age":19},
        {"name":"志成","age":11},
        {"name":"拉塞尔","age":84},
    ]
    # (1)第一种方法heapq
    #找出年龄最大的两位(专门取值的方法)
    print(heapq.nlargest(2,names,lambda x:x["age"]))
    
    # (2)第二种(传统方法,可以排序,可以取值)
    #可以给排序指定一个字典中的键
    names.sort(key=lambda x:x["age"])
    print(names)
    
    # (3)第三种
    # 通过公共键对字典排序然后取值,
    from operator import itemgetter
    new_names = sorted(names,key=itemgetter("age"))
    print(new_names[-2:])
    # 第三种方法是第二种方法的浓缩,不过如果你知道第三种为何和压迫使用第二种了。

    对于字典还可以使用zip反转然后排序

    name={"科比":26,"大姚":38,"丁同":19,"拉塞尔":84,"志成":11}
    print(sorted(zip(name.values(),name.keys())))
    [(11, '志成'), (19, '丁同'), (26, '科比'), (38, '大姚'), (84, '拉塞尔')]
  • 相关阅读:
    dubbo
    常见线程池
    面试之葵花宝典
    Java线程池
    DB2分页
    平凡
    自由职业一时爽,一直自由一直爽
    弱水三千,只取一瓢。
    没病到一定程度,你千万别去。
    一个转身一个轮回
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/8331808.html
Copyright © 2011-2022 走看看