Python中的sort()方法使用基础

一、基本形式

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

iterable.sort(cmp[, key[, reverse]])

参数解释:

(1)iterable指定要排序的list或者iterable,不用多说;

(2)cmp为函数,指定排序时进行比较的函数,可以指定一个函数或者lambda函数,如:

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

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sorted(students, key=lambda student : student[2])

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

sorted(students, key=lambda student : student[2])

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

二、普通用法:

1.原址排序

1)列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的。

x = [4, 6, 2, 1, 7, 9]
x.sort()
print (x) # [1, 2, 4, 6, 7, 9] 

2.副本排序

1)[:]分片方法

x =[4, 6, 2, 1, 7, 9]
y = x[ : ]
y.sort()
print (y) #[1, 2, 4, 6, 7, 9]
print (x) #[4, 6, 2, 1, 7, 9]

注意:y = x[:] 通过分片操作将列表x的元素全部拷贝给y,如果简单的把x赋值给y:y = x,y和x还是指向同一个列表,并没有产生新的副本。

2)sorted方法

sorted返回一个有序的副本,并且类型总是列表,如下:


x =[4, 6, 2, 1, 7, 9]
y = sorted(x)
print (y) #[1, 2, 4, 6, 7, 9]
print (x) #[4, 6, 2, 1, 7, 9] 

print (sorted('Python')) #['P', 'h', 'n', 'o', 't', 'y']

三、高级用法

1.自定义cmp比较函数

def comp(x, y):
	if x < y:
		return 1
	elif x > y:
		return -1
	else:
		return 0
  
nums = [3, 2, 8 ,0 , 1]
nums.sort(comp)
print (nums) # 降序排序[8, 3, 2, 1, 0]
nums.sort(cmp) # 调用内建函数cmp ,升序排序
print (nums) # 降序排序[0, 1, 2, 3, 8]

2.自定义key和reverse

(1.reverse实现降序排序,需要提供一个布尔值,默认为False(升序排列)。

(2.key在使用时必须提供一个排序过程总调用的函数:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
alist = [('2', '3', '10'), ('1', '2', '3'), ('5', '6', '7'), ('2', '5', '10'), ('2', '4', '10')]
# 多级排序,先按照第3个元素排序,然后按照第2个元素排序:
print (sorted(alist, cmp = None, key = lambda x:(int(x[2]), int(x[1])), reverse = False))
-------------------------------------------------------------------------------------------
[('1', '2', '3'), ('5', '6', '7'), ('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10')]

四、operator.itemgetter函数

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

a = [1,2,3]
>>> b=operator.itemgetter(1)      //定义函数b,获取对象的第1个域的值
>>> b(a)
2
>>> b=operator.itemgetter(1,0)  //定义函数b,获取对象的第1个域和第0个的值
>>> b(a)
(2, 1)

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

itemgetter在sort中的用法:

from operator import itemgetter
 
alist = [('2', '3', '10'), ('1', '2', '3'), ('5', '6', '7'), ('2', '5', '10'), ('2', '4', '10')]
 
# 多级排序,先按照第3个元素排序,然后按照第2个元素排序:
print (sorted(alist, cmp = None, key = itemgetter(2, 1), reverse = False))
print (sorted(alist, cmp = None, key = lambda x:itemgetter(2, 1)(x), reverse = False))
print (sorted(alist, cmp = None, key = lambda x:map(int, itemgetter(2, 1)(x)), reverse = False))
-------------------------------------------------------------------------------------------------
 
[('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10'), ('1', '2', '3'), ('5', '6', '7')]
[('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10'), ('1', '2', '3'), ('5', '6', '7')]
[('1', '2', '3'), ('5', '6', '7'), ('2', '3', '10'), ('2', '4', '10'), ('2', '5', '10')]

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python中的sort()方法使用基础 - Python技术站

(0)
上一篇 2023年4月2日 下午5:25
下一篇 2023年4月2日

相关文章

  • Python教程:list.sort()和函数sorted(list)

    1.sort()是列表的方法,修改原列表使得它按照大小排序,没有返回值,返回None In [90]: x = [4, 6, 2, 1, 7, 9] In [91]: x.sort() In [92]: x Out[92]: [1, 2, 4, 6, 7, 9] In [98]: aa = x.sort() In [99]: aa # 返回None 2.so…

    Python开发 2023年4月2日
    00
  • python学习:枚举定义和使用

    1.定义 在某些情况下,一个类的对象是有限且固定的,比如季节类,它只有 4 个对象;再比如行星类,目前只有 8 个对象。这种实例有限且固定的类,在 Python 中被称为枚举类。程序有两种方式来定义枚举类: 直接使用 Enum 列出多个枚举值来创建枚举类。 通过继承 Enum 基类来派生枚举类。 2.使用 使用 Enum 列出多个枚举值来创建枚举类 如下程序…

    Python开发 2023年4月2日
    00
  • python中的mysql操作教程及实例

    一. 数据库在自动化测试中的应用 存测试数据 有的时候大批量的数据,我们需要存到数据库中,在测试的时候才能用到,测试的时候就从数据库中读取出来。这点是非常重要的! 存测试结果 二. python中的数据库之必备前提条件 1. 安装:pyMysql python2中使用mysqldb,python3中不再支持,换成pyMysql 2. 安装步骤 安装pyMys…

    Python开发 2023年4月2日
    00
  • Python学习:基础练习题

    1.输出0到100的数字,如果数字是3的倍数输出Fizz,5的倍数输出Buzz。 同时是3和5的倍数输出FizzBuzz,其他情况则打印原数字 for i in range(100): if i==0: print(i) elif i%3==0 and i%5==0: print(“FizzBuzz”) elif i%3==0: print(“Fizz”) …

    Python开发 2023年4月2日
    00
  • Python学习:标准库之数据持久存储与交换

    持久存储数据以便长期使用包括两个方面:在对象的内存中表示和存储格式之间来回转换数据,以及处理转换后数据的存储区。 标准库包含很多模块可以处理不同情况下的这两个方面 有两个模块可以将对象转换为一种可传输或存储的格式(这个过程被称为序列化)。最常用的是使用pickle持久存储,因为它可以与其他一些具体存储序列化数据的模块集成,如shelve。而对基于web的应用…

    Python开发 2023年4月2日
    00
  • python学习:三目运算符

    一、三目运算符的基本语法 不同语言的三目运算符的基本语法存在差异,以C语言和Python语言为例。 1、通常一般语言如C语言的语言格式如下: 判断条件(返回布尔值) ? 为真时的结果 :为假时的结果 实例: #include<stdio.h> int main(void) { int x=2; x = x%2==0 ? x+1 : x; prin…

    Python开发 2023年4月2日
    00
  • Python学习:构造函数与析构函数

    1.构造函数: __init__(self), 这个方法就是构造函数,在实例化的时候自动调用。 所有如果这个函数内有打印的方法,当实例出来的时候会打印里面的信息。 __init__方法的第一个参数永远都是self,表示创建实例本身,在__init__方法内部,可以把各种属性绑定到self,因为self指向创建的实例本身。 有了__init__方法,在创建实例…

    Python开发 2023年4月2日
    00
  • python教程:模块的搜索路径

    一、模块搜索路径的顺序 模块其实就是一个文件,如果要执行文件,首先就需要找到模块的路径(某个文件夹)。如果模块的文件路径和执行文件不在同一个文件目录下,我们就需要指定模块的路径。 模块的搜索路径指的就是在导入模块时需要检索的文件夹。 导入模块时查找模块的顺序是: 先从内存中已经导入的模块中寻找 内置的模块 环境变量sys.path中找 import sys …

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部