【python】sort和sorted

本文深入探讨了Python中list.sort()和sorted()函数的使用方法,包括关键字参数的灵活应用,如cmp、key和reverse,以及如何利用operator模块的itemgetter、attrgetter和methodcaller函数进行高效排序。同时,介绍了如何实现复杂数据结构的排序,如带有数字的字符串列表,并提供了实用的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法:

list.sort(func=None, key=None, reverse=False)

        cmp  -- 可选参数, 如果指定了该参数会使用该参数的方法进行排序;

        key   -- 用来在进行比较之前指定每个列表元素上要调用的函数,指定可迭代对象中的一个元素来进行排序;

        reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认);

sorted(iterable, key=None, reverse=False)

        iterable -- 可迭代对象;


sort 和sorted 的区别:

  • sorted()不会改变原来的list,返回一个新的已经排好序的list,而sort()返回值为None;
  • list.sort()方法仅仅被list所定义,sorted()可用于任何一个可迭代对象;

#区分大小写的字符串比较排序

>>> sorted("This is a test string from Andrew".split(), key=str.lower)

['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

 

>>> student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
   ]

>>> sorted(student_tuples, key=lambda student:student[2])   # sort by age

[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

 

#先排序列表list中元素的第一个关键字,然后在第一个元素的基础上排序按第二个关键字进行排序:

>>> list = [('d',3),('a',5),('d',1),('c',2),('d',2)]

>>> print sorted(list, key = lambda x:(x[0],x[1]))

[('a', 5), ('c', 2), ('d', 1), ('d', 2), ('d', 3)]

Operator Module Functions

这个操作模块有:

  • operator.itemgetter()   ----- 通过下标
  • operator.attrgetter()   ----- 通过参数
  • operator.methodcaller() ----- python 2.5 被引入,下文详细介绍

使用这几个函数,对于上面 Key Function 的例子处理起来将会更加的简便和快速.

先一起介绍 operator.itemgetter() 和 operator.attrgetter() ,会更加容易理解:

 

>>> from operator import itemgetter, attrgetter

>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)
这个操作模块也允许多层次的进行排序,例如可以先排序 “成绩grand” 再排序 “年龄age”


>>> sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]


>>> list = [('d',3),('a',5),('d',1),('c',2),('d',2)]
>>> from operator import itemgetter
>>> sorted(list, key=itemgetter(0,1))
[('a', 5), ('c', 2), ('d', 1), ('d', 2), ('d', 3)]

但是还是推荐key function 中的方法,因为为了这一个排序而引入一个库文件,相对来说得不偿失。




operator.methodcaller() 函数:
这个函数是对某个对象的使用固定参数进行排序,例如:str.count() 函数可以计算每个字符串对象中含有某个参数的个数,那运用这个函数我就可以通过 str.count() 计算出某个字符的个数从而来确定排序的优先级:

>>> from operator import methodcaller
>>> messages = ['critical!!!', 'hurry!', 'standby', 'immediate!!']
>>> sorted(messages, key=methodcaller('count', '!'))
['standby', 'hurry!', 'immediate!!', 'critical!!!']

 

根据字符串中的数字排序,如f10应该在f2后面

#encoding=utf-8 
print '中国' 
#根据字符串中的数字排序,如f10应该在f2后面 
import re 
   
re_digits = re.compile(r'(\d+)') 
   
def emb_numbers(s): 
    pieces=re_digits.split(s) 
    pieces[1::2]=map(int,pieces[1::2])     
    return pieces 
   
def sort_strings_with_emb_numbers(alist): 
    aux = [(emb_numbers(s),s) for s in alist]   #[(['file',1,'.txt'],'file1.txt')]
    aux.sort() 
    return [s for __,s in aux]     #提取元组中第二个元素,比如'file1.txt'
   
def sort_strings_with_emb_numbers2(alist): 
    return sorted(alist, key=emb_numbers) 
   
filelist='file10.txt file2.txt file1.txt'.split() 
   
print filelist 
   
print '--DSU排序' 
print sort_strings_with_emb_numbers(filelist) 
   
print '--内置DSU排序' 
print sort_strings_with_emb_numbers2(filelist)





中国
['file10.txt', 'file2.txt', 'file1.txt']
--DSU排序
['file1.txt', 'file2.txt', 'file10.txt']
--内置DSU排序
['file1.txt', 'file2.txt', 'file10.txt'] 

ref: https://www.cnblogs.com/ShaunChen/p/6205330.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值