Python中的各种排序问题
本章目录,快速浏览所需内容:
在编写Python时,经常需要进行排序操作,简单的list排序还是很容易的,碰到复杂的就没办法,只能去查了,现在把编程过程中遇到的所有排序问题列下来,欢迎大家提供更加简洁,高效的排序方法,也欢迎
大家给出自己在Python遇到的排序问题.
Python排序根本依赖于两个内建的函数:
- list.sort() 对list成员进行排序,不返回副本
- sorted(list) 对list成员进行排序,返回副本
注:以下使用sorted(list)进行演示
基本的排序
1.列表(list)
1.1按列表元素大小排序
- #数值类型
- >>> sorted([1,6,3,2,5,7,4])
- [1, 2, 3, 4, 5, 6, 7]
- #字符类型
- >>> sorted(['a','d','e','b','f','c'])
- ['a', 'b', 'c', 'd', 'e', 'f']
- #字符串类型
- >>> sorted(['a','ad','ada','ad1','abe','b','f','c'])
- ['a', 'abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f']
- #字符串中包含大小写
- >>> sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'])
- ['A', 'Abe', 'a', 'abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f']
- #小写字母优先
- >>> sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'],key=str.lower)
- ['a', 'A', 'abe', 'Abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f']
规则解释:
- 如果list内的元素是字符/字符串,默认优先将大写字母排前面,其次再按照规则2进行排序;通过参数
key=str.lower
控制其从小字母优先排. - 如果list内的元素是字符/字符串,将依次按照该字符/字符串的ASCCII值进行排序
- 虽然列表内的元素的类型可以不一样,但是sotred(list)不支持列表中既有数字又有字符的排序
1.2按列表元素的属性
- #按列表元素的长度进行排序
- sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'],key=lambda str:len(str))
- ['a', 'A', 'b', 'f', 'c', 'ad', 'ada', 'ad1', 'abe', 'Abe']
注:
lambda为匿名函数,没有函数的具体名称,使用匿名函数是为了使代码更为精简.实际上lambda str:len(str)
等价于:
- def Getlenght(str):
- return len(str)
2.字典(dictory)
- #对字典进行排序
- >>> sorted({1: 'D', 5: 'B', 2: 'B', 4: 'E', 3: 'A'})
- [1, 2, 3, 4, 5]
- #按照字典中的values的大小进行排序
- >>> dict
- {1: 'DE', 2: 'DDDB', 3: 'A', 4: 'QPOIE', 5: 'WWB'}
- >>> dict.items()
- dict_items([(1, 'DE'), (2, 'DDDB'), (3, 'A'), (4, 'QPOIE'), (5, 'WWB')])
- >>> sorted(dict.items(),key=lambda value:value[1])
- [(3, 'A'), (2, 'DDDB'), (1, 'DE'), (4, 'QPOIE'), (5, 'WWB')]
- #按照字典中的values的长度进行排序
- >>> sorted(dict.items(),key=lambda value:len(value[1]))
- [(3, 'A'), (1, 'DE'), (5, 'WWB'), (2, 'DDDB'), (4, 'QPOIE')]
对字典进行排序,实际上是对字典keys组成的list进行排序,即sorted(dict)==sorted(sorted.values())
3.元组(tuple)排序
3.1单个元组排序和列表的方法一样
- #元组排序
- >>> tup1=(1,5,3,4,2,7,6)
- >>> sorted(tup1)
- [1, 2, 3, 4, 5, 6, 7]
- >>> tup2=('a','d','f','b','e','c')
- >>> sorted(tup2)
- ['a', 'b', 'c', 'd', 'e', 'f']
3.2元组列表
- >>> tuplist=[('a',1),('c',4),('e',0),('d',2),('f',3)]
- >>> student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),]
- >>>
- #直接对元组列表进行排序
- >>> sorted(tuplist)
- [('a', 1), ('c', 4), ('d', 2), ('e', 0), ('f', 3)]
- #按照元组的第某个值进行排序
- >>> sorted(tuplist,key=lambda tup:tup[1])
- [('e', 0), ('a', 1), ('d', 2), ('f', 3), ('c', 4)]
- #按照元组的第某个值进行排序
- >>> sorted(student_tuples, key=lambda student: student[2])
- [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
注:直接对元组列表进行排序是按照元组的第一个值进行排序
高级排序
1.使用Operator模块
- >>> from operator import itemgetter, attrgetter
- #一个排序关键字
- >>> sorted(student_tuples, key=itemgetter(2))
- [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
- #两个排序关键字
- >>> sorted(student_tuples, key=itemgetter(1,2))
- [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
2.字符串的多关键字排序
基于上面的多关键字排序,可以对字符串做一些有趣的排序,平常我们对字符串进行排序时,可能带有数字,这时候排序只是像平常那样逐个字符串ASCCII值进行排序:
- >>> list01=['dog1','cat3','bird7','swan4','penguin6','cattle5']
- #字符串排序
- >>> sorted(list01)
- ['bird7', 'cat3', 'cattle5', 'dog1', 'penguin6', 'swan4']
但是有时候我们需要按照字符串中的字母进行排序,这时候就需要将字符串中的数字切割出来,然后传入key参数给sorted.
- #按照字符串的某个数字进行排序
- >>> import re
- >>> def sort_str(str):
- if str:
- try:
- c=re.findall('\d+',str)[0]
- except:
- c=-1
- return int(c)
- >>> sorted(list01,key=sort_str)
- ['dog1', 'cat3', 'swan4', 'cattle5', 'penguin6', 'bird7']
如果字符串中类似这样的,而你只想对字符串的某些位置的数字进行排序,我们先来看看只针对字符串一个特定位置的排序.
['cb_cha0_amni0','cb_cha0_amni2','cb_cha1_amni1','cb_cha0_amni3']
使用上面的排序方法得到
- >>> list02=['cb_cha0_amni0','cb_cha0_amni2','cb_cha1_amni1','cb_cha0_amni3']
- >>> sorted(list02,key=sort_str)
- ['cb_cha0_amni0', 'cb_cha0_amni2', 'cb_cha0_amni3', 'cb_cha1_amni1']
上面的自定义提取数字的函数c=re.findall('\d+',str)[0]
这一句决定了要对字符串的第几个数字进行排序,假设我要对上面字符数组的第二个值进行排序,重新定义一个提取数值的方法,每次调用返回字符串的第二个数字.
- >>> def sort_str1(str):
- if str:
- try:
- c=re.findall('\d+',str)[1]
- except:
- c=-1
- return int(c)
- >>> sorted(list02,key=sort_str1)
- ['cb_cha0_amni0', 'cb_cha1_amni1', 'cb_cha0_amni2', 'cb_cha0_amni3']
比较炸的是你的需求是:按照字符串中的多个字母排序(比如优先按照第一个字母排序,然后按照第二个字母排序)
一个想法是:把字符串解析为元组,然后使用itemgetter
来完成多关键字排序.
- #字符串已经被拆分为元组
- >>> list03=[('cb_cha',0,'_amni',0),('cb_cha',1,'_amni',1),('cb_cha',0,'_amni',2),('cb_cha',0,'_amni',3)]
- #对元祖进行多关键字排序
- >>> listtmp=sorted(list03, key=itemgetter(1,3))
- >>> listtmp
- [('cb_cha', 0, '_amni', 0), ('cb_cha', 0, '_amni', 2), ('cb_cha', 0, '_amni', 3), ('cb_cha', 1, '_amni', 1)]
- #将排序后的元组转成字符串
- >>> list(map(lambda strtmp:''.join(map(str,strtmp)),listtmp))
- ['cb_cha0_amni0', 'cb_cha0_amni2', 'cb_cha0_amni3', 'cb_cha1_amni1']
注:这里用了匿名函数和多个map,这对处理大量的数据是的问题,会耗费很多时间.这种情况比较好的方法是使用excle进行排序,当然,你得手动先将数据分割成一列一列的.

Python中的各种排序问题的更多相关文章
- 对Python中函数参数类型及排序问题,三个方面的总结
Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参 ...
- (四)Python中的“四大才子”(字符串、列表、字典、集合)
前戏:在python中把数据序列分为可变(mutable)和不可变(immutable)两种 不可变:string.int.float.tuple 特点:相同对象只是占用一个内存地址,不管有多少个变量 ...
- Python中使用operator模块实现对象的多级排序
Python中使用operator模块实现对象的多级排序 今天碰到一个小的排序问题,需要按嵌套对象的多个属性来排序,于是发现了Python里的operator模块和sorted函数组合可以实现这个功能 ...
- python中os.listdir( )函数读取文件夹
编写pytohn脚本时通常需要批处理. 列出指定目录下的所有文件/文件夹 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表,但有个很明显的缺点,它的默认顺序不是有序的或 ...
- [转]Python中的str与unicode处理方法
早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...
- python中的Ellipsis
...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...
- python中的默认参数
https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- python中的TypeError错误解决办法
新手在学习python时候,会遇到很多的坑,下面来具体说说其中一个. 在使用python编写面向对象的程序时,新手可能遇到TypeError: this constructor takes no ar ...
随机推荐
- pyrhon 第一个小购物车例子
product_list=[[],[],[],[]] shopping_list=[] salary = input("请输入你的工资:") if salary.isdigit() ...
- Kubernetes(k8s) docker 修改 /dev/shm大小
一.问题 /dev/shm在/etc/fstab中挂载,对应tmpfs,实际使用的是内存的空间.默认情况下,/dev/shm为物理内存大小的一半. 在Kubernetes上跑docker,发现/dev ...
- AtomicIntegerFieldUpdater和AtomicInteger
为什么有了AtomicInteger还需要AtomicIntegerFieldUpdater? 当需要进行原子限定的属性所属的类会被创建大量的实例对象, 如果用AtomicInteger, 每个实例里 ...
- 序列方差[NTT]
也许更好的阅读体验 \(\mathcal{Description}\) 给你一个长度为\(n\)的数组\(a\) 你会得到 \(q\) 条指令, 分两种: \(1\ l\ r\ w\) 表示把 \(l ...
- 怎样通过正则匹配IP地址
Ipv4的地址是0.0.0.0 到 255.255.255.255, 匹配这个字段需要判断三种情况: 1. 如果第一位是0或1, 则第二位和第三位可以是0-9的任意数值: [01]\d\d 2. 如果 ...
- shell 学习笔记5-shell-if语句
一.if条件语句 1.语法 1)单分支结构 第一种 if <条件表达式> then 指令 fi 第二种 if <条件表达式>:then 指令 fi 上文的"<条 ...
- WPF GridView动态添加项并读取数据
假设数据库有如下表, 首先我们创建一个WPF工程,界面如下 <Window x:Class="WpfApplication2.MainWindow" xmlns=" ...
- DotNet 使用阿里云媒体转码服务
公司项目中一部分文件放到了阿里云 OSS 上,其中有些音频文件是 amr 类型的,在后期使用的时候比较麻烦,所以需要转换成 mp3 的文件,方便以后使用.本来想使用 ffmpeg 处理,但由于文件都存 ...
- windows RabbitMQ Server 环境配置中的一些坑
原文:https://blog.csdn.net/lindonglian/article/details/55805637 RabbitMQ的服务端基于Erlang语言编写,要在机器上安装Rabbit ...
- 云计算---openstack创建虚拟机过程
虚拟机创建过程: (1)界面或命令行通过RESTful API向keystone获取认证信息.(2)keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求.(3)界面或 ...