• Python的operator.itemgetter函数和sorted函数


    写这篇文章的目的是之前在《机器学习实战》用Python3实现KNN算法时用到的几个函数不太懂,

    地址:
    1- https://github.com/hitergelei/Self-Learning/blob/master/Machine Learning/Machine Learning in Action/2_KNN.py
    2-https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py

    所以相关函数用法在这里做一下解析:

    • Python的operator.itemgetter函数

    operator模块提供的itemgetter函数用于获取对象的哪些维的数据,参数为一些序号(即需要获取的数据在对象中的序号),下面看例子。

    In [10]: import operator
    
    In [11]:  a = [1,2,3]
    
    In [12]:  b = operator.itemgetter(1) //定义函数b,获取对象的第1个域的值
    
    In [13]: b(a)
    Out[13]: 2
    
    In [14]:  c = operator.itemgetter(2,1) //定义函数b,获取对象的第2个域和第1个的值
    
    In [15]:  c(a)
    Out[15]: (3, 2)
    

    要注意,operator.itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。

    • Python的sorted函数

    sorted() 函数对所有可迭代的对象进行排序操作。
    sort 与 sorted 区别:
    1- sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
    2- list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

    实例:
    
    In [20]:  a= [5,7,6,4,3,21,1,2]
    
    In [21]: b = sorted(a)  #保留原列表a,返回一个新列表b
    
    In [22]: a
    Out[22]: [5, 7, 6, 4, 3, 21, 1, 2]   #原列表a不变
    
    In [23]: b
    Out[23]: [1, 2, 3, 4, 5, 6, 7, 21]  #新列表b
    
    

    sorted 语法:

    sorted(iterable[, cmp[, key[, reverse]]])
    

    参数说明:
    (1) iterable :可迭代对象。

    (2) cmp : cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数
    即:cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。

    例如students为类对象的list,没个成员有三个域,用sorted进行比较时可以自己定cmp函数,这里要通过比较第三个数据成员来排序,代码可以这样写:


    注:key指定的lambda函数功能是去元素student的第三个域(即:students[2]),因此sorted排序时,会以students所有元素的第三个域来进行排序。

    (注:python3 sorted取消了对cmp的支持。 )

    如果我们想用第二个关键字排过序后再用第一个关键字进行排序呢?

    补充另一种方法:
    sorted(M, key = operator.itemgetter(1,0))
    先根据第2个域排序,再根据第1个域排序

    (3) key :key为函数,指定取待排序元素的哪一项进行排序,函数用上面的例子来说明,代码如下:

    有了上面的operator.itemgetter函数,也可以用该函数来实现,例如要通过student的第三个域排序,可以这么写:
    sorted(students, key=operator.itemgetter(2)) 默认reverse为false

    sorted函数也可以进行多级排序,例如要根据第二个域和第三个域进行排序,可以这么写:
    sorted(students, key=operator.itemgetter(1,2))
    即先根据第二个域排序,再根据第三个域排序。

    (4) reverse :是一个bool变量,表示升序还是降序排列,默认为false(升序排列),定义为True时将按降序排列。

    sorted(students, key=operator.itemgetter(2),reverse = True)

    sorted(students, key=operator.itemgetter(1),reverse = True)

    sorted(students, key=operator.itemgetter(1,2),reverse = True)

  • 相关阅读:
    事务一致性
    面试汇总
    什么是时间复杂度?
    语言为什么都要实例化后才能用 ?实例化后这里东西是放在堆里面还是栈里面?
    LRU 算法——简单的淘汰算法
    Redis为什么可以做到10万的QPS?
    Redis基础
    Redis基于Set如何实现用户关注模型?
    资深技术Leader曹乐:如何成为技术大牛
    对MySQL查询结果进行替换
  • 原文地址:https://www.cnblogs.com/HongjianChen/p/8612176.html
Copyright © 2020-2023  润新知