• python3----函数(sort和sorted)


        在学习python的过程中,感觉python中的排序相和c++中的泛型算法还是比较相似的,但相对于c++而言更加简单易用。

    python中列表的内置函数sort()可以对列表中的元素进行排序,而全局性的sorted()函数则对所有可迭代的序列都是适用的;并且sort()函数是内置函数,会改变当前对象,而sorted()函数只会返回一个排序后的当前对象的副本,而不会改变当前对象。

    1、内置函数sort()

    原型:sort(fun,key,reverse=False)

    参数fun是表明此sort函数是基于何种算法进行排序的,一般默认情况下python中用的是归并排序,并且一般情况下我们是不会重写此参数的,所以基本可以忽略;

    参数key用来指定一个函数,此函数在每次元素比较时被调用,此函数代表排序的规则,也就是你按照什么规则对你的序列进行排序;

    参数reverse是用来表明是否逆序,默认的False情况下是按照升序的规则进行排序的,当reverse=True时,便会按照降序进行排序。

    下面 通过简单的例子进行解说:

     1 from operator import attrgetter,itemgetter
     2 
     3 list1 = [(2,'huan',23),(12,'the',14),(23,'liu',90)]
     4 
     5 #使用默认参数进行排序,即按照元组中第一个元素进行排序
     6 list1.sort()
     7 print(list1)
     8 #输出结果为[(2, 'huan', 23), (12, 'the', 14), (23, 'liu', 90)]
     9 
    10 #使用匿名表达式重写key所代表的函数,按照元组的第二个元素进行排序
    11 list1.sort(key=lambda x:(x[1]))
    12 print(list1)
    13 #[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]
    14 
    15 #使用匿名表达式重写key所代表的函数,按照元组的第三个元素进行排序
    16 list1.sort(key=lambda x:(x[2]))
    17 print(list1)
    18 #[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]
    19 
    20 #使用匿名函数重写key所代表的函数,先按照元组中下标为2的进行排序,
    21 # 对于下标2处元素相同的,则按下标为0处的元素进行排序
    22 list1.sort(key=lambda x:(x[2],x[0]))
    23 print(list1)
    24 #[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]
    25 
    26 #使用operator模块中的itemgetter函数进行重写key所代表的函数,按照下标为1处的元素进行排序
    27 list1.sort(key=itemgetter(1))
    28 print(list1)
    29 #[(2, 'huan', 23), (23, 'liu', 90), (12, 'the', 14)]
    30 
    31 #使用operator模块中的itemgetter函数进行重写key所代表的函数,按照下标为2处的元素进行排序
    32 list1.sort(key=itemgetter(2))
    33 print(list1)
    34 # [(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]
    35 
    36 # 此处可以类比lambda中的排序方法,就不再解释
    37 list1.sort(key=itemgetter(2,0))
    38 print(list1)
    39 #[(12, 'the', 14), (2, 'huan', 23), (23, 'liu', 90)]

    对于上述中的匿名函数大家如果 不了解的可以自己去了解一下,这里我就不展开了。

    这里我想解释一下operator这个模块中的两个函数:

    (1)itemgetter

    operator.itemgetter(item)operator.itemgetter(*items)这个函数会调用所传入的操作数的__getitem__()方法返回一个带有item的可调用对象,如果传入的参数是多个,那么返回带有一个元组类型的可调用对象。例如: f itemgetter(2), 调用 f(r) 后,将会返回r[2]  itemgetter(2, 5, 3), 调用 g(r) 后将会返回元组 (r[2], r[5], r[3]). (2)attrgetteroperator.attrgetter(attr)operator.attrgetter(*attrs)这个函数返回一个带有操作数中的attr属性的可调用对象,如果多个属性被传入,那么返回带有这些属性的元组。这些属性的名字里可以包含包含多个子名字例如:attrgetter('name'), 调用f(b) 将返回b.name.attrgetter('name', 'date'), 调用 f(b) 将返回(b.name, b.date).attrgetter('name.first', 'name.last'), 调用f(b) 将返回 (b.name.first, b.name.last)

    2、全局函数sorted()

    对于sorted()函数中key的重写,和sort()函数中是一样的,所以刚刚对于sort()中讲解的方法,都是适用于sorted()函数中,在下面的解释中我也就不再列举了,并且下面将要讲解的key的重写也同样是适用于sort()函数的,那么为什么不再sort()函数中列举完呢,那是为了不偏不倚,给大家一个客观地理解。

    下面仍然从一个例子切入:

     1 from operator import attrgetter
     2 class Data:
     3     article_name = str()
     4     readers = 0
     5     def __init__(self,tpl):
     6         self.article_name = tpl[0]
     7         self.readers = tpl[1]
     8     def getKey(self):
     9         return self.readers
    10     def __str__(self):
    11         return str(str(self.article_name)+str(':')+str(self.readers))
    12 
    13 list1 = [Data(("java",100)),Data(("c++",100)),Data(("python",89)),Data(("c++",90))]
    14 
    15 #此处调用attrgetter函数使得按照readers进行排序
    16 list2 = sorted(list1,key=attrgetter("readers"))
    17 """结果为
    18 python:89
    19 c++:90
    20 java:100
    21 c++:100
    22 """
    23 
    24 #此处使得list1先按照article_name进行排序,对于名字相同的再按照readers进行排序
    25 list3 = sorted(list1,key=attrgetter("article_name","readers"))
    26 """
    27 结果为:
    28 c++:90
    29 c++:100
    30 java:100
    31 python:89
    32 """
    33 
    34 #使用类中的自定义函数也同样可以操作
    35 list4 = sorted(list1,key = Data.getKey)
    36 """
    37 结果为:
    38 python:89
    39 c++:90
    40 java:100
    41 c++:100
    42 """

    上面例子的结果都是通过打印出来的结果。

    对于sorted()函数,同样可以使用sort()函数中介绍的方法,大家可以自己进行尝试。

    当然最后说一下,在上面所有的例子中我都没有使用到reverse参数,对于这个参数,是用于控制排序的方向的,大家可以自己试试,在这里也就不介绍了。

  • 相关阅读:
    社会影响力入门:打造有所作为的公司
    JSP中的include有哪些?有什么差别?
    关于程序猿怎样降低程序Bug的若干建议
    linux文件打开模式
    IntelliJ IDEA 问题总结之中的一个 —— jar包、assets、maven、git
    linux下改动内核參数进行Tcp性能调优 -- 高并发
    思科模拟器配置三层交换机局域网
    MFC调试小技巧
    JAVA基础编程50题(10-12题)具体解释
    加速度传感器的原理和应用-手机翻转、失重检测、运动检测、位置识别
  • 原文地址:https://www.cnblogs.com/jonm/p/8281228.html
Copyright © 2020-2023  润新知