python 内置排序函数使用

python内置关于排序的工具主要有两个一个是列表自带的sort()方法,另外一个是sorted()函数。Python 列表内置方法可以直接修改列表。而sorted()内置函数从一个可迭代对象(列表,元组等都可以)构建一个新的排序列表。其函数原型分别如下:

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

简单使用

对列表进行默认排序

a = [1, 4, 2, 5, 3]
a.sort() # 默认升序排列
a.sort(reverse=True) # 降序排列 
b = sorted(a)

自定义排序方法

从函数原型来看,可以看到两者都具有两个可选参数,它们都必须指定为关键字参数。
key指定带有单个参数的函数,用于从 iterable 的每个元素中提取用于比较的键 (例如 key=str.lower)。默认值为 None (直接比较元素)。key形参的值应该是个函数(或其他可调用对象),它接受一个参数并返回一个用于排序的键。

用lambda函数实现自定义排序

假设有其他类型的变量,比如一个自定义的类或者列表中又是一个列表。以官网例子为例有这样一个列表,其元素为元组,

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

可以用以下方式按照年龄排序

sorted(student_tuples, key=lambda student: (firstkey, secondkey) )
sorted(student_tuples, key=lambda student: student[2])
sorted(student_tuples, key=lambda student: (student[2], student[1])) //定义优先级

类似的有自定义类

class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age
    def __repr__(self):
        return repr((self.name, self.grade, self.age))

可以用如下方式进行排序

sorted(student_objects, key=lambda student: student.age)

也可以显示定义一个函数,且只有一个参数,返回用于排序的键,比如

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

def cmp(x):
  return x[2]
  
student_tuples.sort(key = cmp)

总之就是定义一个函数返回一个用于排序的键,可以用lambda函数或者def定义都可以。

使用operator模块函数

上面实现的简单函数实际就是实现了返回一个有序结构的第n的元素,或者某个类中的某个属性,因此 Python 提供了便利功能,使访问器功能更容易,更快捷。operator 模块有 itemgetter() 、 attrgetter() 函数。分别完成返回第n个元素,某个属性功能。上面的排序可以用如下方式进行实现

from operator import itemgetter, attrgetter
sorted(student_tuples, key=itemgetter(2))
sorted(student_objects, key=attrgetter('age'))

老式自定义排序方法

在python2中,sort有一个cmp参数,即用一个函数来自定义比较,在python3中这种方式被取消。为了继承类似的用法,在 Python 3.2 中, functools.cmp_to_key() 函数被添加到标准库中的 functools模块中。
这种作用先定义如何比较两个变量,以上面的学生列表按照年龄排序为例

from functools import cmp_to_key

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

def cmp(x, y):
  return x[2] - y[2]
  
student_tuples.sort(key = cmp_to_key(cmp))

这种做法自定义比较函数接收两个形参,返回比较结果(bool),而新式方法接受一个参数,返回的是比较的键。

对字典进行排序

假设有字典d = {'b':2, 'a':1,'c':8,'d':4},则可以通过以下方式对字典按照键和值进行排序

dict(sorted(x.items(), key=lambda item: item[0]))  // 按照key
dict(sorted(x.items(), key=lambda item: item[1])) //按照value
或
{k: v for k, v in sorted(x.items(), key=lambda item: item[0])}
{k: v for k, v in sorted(x.items(), key=lambda item: item[1])}

key传入类

class Key:
    def __init__(self,a):
        self.a = a
    def __lt__(self, other):
        return self.a+other.a < other.a+self.a
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • 文:郑元春一个有着美好梦想的coder! 人生苦短,我用Python。 P.S. 个人认为,查找和排序是算法的核心...
    北静王阅读 2,127评论 3 10
  • Python要对list迭代序列的排序,提供了两种方法: list的成员函数sort()排序 内建函数sorted...
    翎月阅读 1,525评论 0 5
  • 一、sort,sorted函数介绍: Sort函数是list列表中的函数,而sorted可以对list或者iter...
    关北阅读 2,438评论 0 0
  • sort() 是Python列表的一个内置的排序方法,list.sort() 方法排序时直接修改原列表,返回Non...
    星垂平野阔阅读 74,869评论 1 12
  • 震惊,Python竟然如此排序 为图方便,以下代码均在ipython中操作 1.列表排序 使用sort()进行排序...
    AllenDown阅读 3,721评论 0 1