python-一种字符串排序方式
最近工作中,需要使用python实现一种排序方式,简要说明如下:
1.排序方式
假设有一个序列,数据为:['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23'],
排序后需要达到这个效果:['n1', 'n2', 'n3', 'n10', 'n11', 'n13', 'n20', 'n21', 'n23']。
最开始当然想的是使用内建函数sorted()进行排序,但效果如下:
1 l = ['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23']
2 for item in sorted(l):
3 print (item+' ', end='')
运行结果:
1 n1 n10 n11 n13 n2 n20 n21 n23 n3
很明显,没有达到我们想要的效果,后来上网查资料,发现这篇博客写的可以用来参考,地址:python 根据字符串内数字排序。
实现的思想是通过自定义排序的方式来实现,代码如下,在代码中,使用正则表达式匹配字符串尾部的数字。
1 import os
2 import sys
3 import re
4
5 def sort_key(s):
6 if s:
7 try:
8 suffix = re.search('\d+$', s)
9 num = int(suffix.group())
10 except:
11 num = -1
12 return num
13
14 def strsort(alist):
15 alist.sort(key=sort_key)
16 return alist
17
18
19 if __name__ == "__main__":
20 l = ['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23']
21 sl = strsort(l)
22 print (sl)
输出结果:
1 ['n1', 'n2', 'n3', 'n10', 'n11', 'n13', 'n20', 'n21', 'n23']
可以看出,通过这种方法可以实现我们想要的排序方式。
2.扩展
现在,做一些扩展,假设现在需要排序的字符串的格式组成方式为:nxxx_name_nxxx,也就是由前缀数字和后缀数字组成,例如,我们要把下列的这些字符串进行排序:
n1_name_n1、n2_name_n2、n1_name_n3、n2_name_n1、n3_name_n1、n3_name_n2,先以前缀数字优先排序,再以后缀数字优先排序。排序后得到的顺序为:
n1_name_n1、n1_name_n3、n2_name_n1、n2_name_n2、n3_name_n1、n3_name_n2,那么我们可以给前缀数字赋一个很大的权重,再加上后缀,组成的数字就是排序的依据。
实现代码如下,在代码中,我给前缀的数字乘上了255,后缀的数字没有大于255的,所以能够实现上述的排序结果。
1 import os
2 import sys
3 import re
4
5 def sort_key(s):
6 if s:
7 try:
8 prefix = re.match('n\d+', s)
9 suffix = re.search('\d+$', s)
10 if prefix != None:
11 prefix_num = int(prefix.group()[1:])
12 else:
13 prefix_num = -1
14 if suffix != None:
15 suffix_num = int(suffix.group())
16 else:
17 suffix = -1
18 num = prefix_num * 255 + suffix_num
19 except:
20 num = -1
21 return num
22
23 def strsort(alist):
24 alist.sort(key=sort_key)
25 return alist
26
27
28 if __name__ == "__main__":
29 l_raw = ["n1_name_n1", "n2_name_n2", "n1_name_n3", "n2_name_n1", "n3_name_n1", "n3_name_n2"]
30 l_sorted = strsort(l_raw)
31 print (l_sorted)
输出结果:
1 ['n1_name_n1', 'n1_name_n3', 'n2_name_n1', 'n2_name_n2', 'n3_name_n1', 'n3_name_n2']
这种思想,还可以用来处理多种条件下的排序,还是挺好用的,也是在工作过程中一位同事告诉我的。
python-一种字符串排序方式的更多相关文章
- python的惊艳之举--源于一个同事分享16种字符串反转方式
日期:2018/12/19 最近刚学习了Python的入门课程,准备寻找你的进阶门路,偶尔得到一个老同事微信分享,标题让我这种greenhand心砰砰砰... 好了,看标题: 面试官让用 5 种 py ...
- 【转】Java 5种字符串拼接方式性能比较。
最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,于是用Junit写了个单元测试. 代码如下: import java.util.ArrayList; import java.uti ...
- Java 5种字符串拼接方式性能比较。
最近写一个东东,可能会考虑到字符串拼接,想了几种方法,但对性能未知,于是用Junit写了个单元测试. 代码如下: import java.util.ArrayList; import java.uti ...
- python——几种截图对比方式!
本次记录的几种截图对比方式,主要是为了在进行手机自动化测试时,通过截图对比来判断测试的正确性,方式如下: # -*- coding: utf- -*- ''' 用途:利用python实现多种方法来实现 ...
- Java 5种字符串拼接方式性能比较
http://blog.csdn.net/kimsoft/article/details/3353849 import java.util.ArrayList; import java.util.Li ...
- python——3种字符串反转方法
在学习过程中,总结了3种字符串反转方法: 1.切片法 这种方法最为简便 str='abad' print(str[::-1]) · 用切片操作,将字符串以步长-1重新整理,即 'str[-1],str ...
- c++两种字符串赋值方式 并介绍 C语言下遍历目录文件的方式
c++字符串声明:一种是声明字符数组并赋值,另一种是直接声明string类 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #incl ...
- Javascript的是三种字符串连接方式
第一种:用连接符“+”连接字符串 str="a"; str+="b"; 这种方法相对以下两种,最便捷快速.建议100字符以下的连接使用这种连接方式. 第二种:以 ...
- JS中三种字符串连接方式及其性能比较
工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法 用连接符“+”把要连接的字符串连起来 ...
- gcc中支持的一种字符串表示方式
gcc支持的一种的字符串的表示形式 "xxx" "xxx" "xxx" 他会将这3个字符串连成一个并 且只会在最后的一个字符串末尾添加 '\ ...
随机推荐
- 给蚂蚁金服 antv 提个 PR, 以为是改个错别字, 未曾想背后的原因竟如此复杂!
前言 什么? 你不了解G2Plot? 没关系, 今天咱们要分享的内容和G2Plot的关系, 就像雷锋和雷峰塔的关系. 因此, 不必担心听不懂. 我一直觉得, 如果我写的文章有人看不懂, 那一定是我写的 ...
- 第 8章 Python 爬虫框架 Scrapy(下)
第 8章 Python 爬虫框架 Scrapy(下) 8.1 Scrapy 对接 Selenium 有一种反爬虫策略就是通过 JS 动态加载数据,应对这种策略的两种方法如下: 分析 Ajax 请求 ...
- 了解3D世界的黑魔法-纯Java构造一个简单的3D渲染引擎
简介: 对于非渲染引擎相关工作的开发者来说,可能认为即使构建最简单的3D程序也非常困难,但事实上并非如此,本篇文章将通过简单的200多行的纯 Java代码,去实践正交投影.简单三角形光栅化.z缓冲(深 ...
- RocketMQ 消息集成:多类型业务消息-普通消息
简介: 本篇将从业务集成场景的诉求开始,介绍 RocketMQ 作为业务消息集成方案的核心能力和优势,通过功能场景.应用案例以及最佳实践等角度介绍 RocketMQ 普通消息类型的使用. 引言 Apa ...
- 【USENIX ATC】支持异构GPU集群的超大规模模型的高效的分布式训练框架Whale
简介: 高效大模型训练框架Whale(EPL)入选USENIX ATC 作者:张杰.贾贤艳 近日,阿里云机器学习PAI关于深度学习模型高效的分布式训练框架的论文< Whale: Efficien ...
- 创新推出 | Serverless 场景排查问题利器:函数实例命令行操作
简介: 实例命令行功能的推出希望能消除用户使用 Serverless 的"最后一公里",直接将真实的函数运行环境展现给用户,此后 Serverless 将不再是一个"黑 ...
- [MongoDB] Mongo 表字段添加索引, 查看索引, 删除索引
查看索引: db.getCollection('xx').getIndexes(); 创建索引: # 1 代表升序,-1代表降序,name 指定索引名 db.getCollection('xx').c ...
- [Go] godoc 打开本地文档, windows 同样适用
godoc 提供了在无网环境下 浏览官方文档的便利. 示例: $ go get golang.org/x/tools/cmd/godoc $ godoc -http=localhost:6060 Li ...
- mybatis插件generator使用生成错误问题Execution default-cli of goal org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate failed: Exception getting JDBC Driver
使用插件除了其他回答的路径等问题,我遇到的把jar版本换一下就成了 把5点几的换成8点几的就好使了
- docker-compose搭建的Mysql主主复制
注意下面几点: 1)要保证同步服务期间之间的网络联通.即能相互`ping`通,能使用对方授权信息连接到对方数据库(防火墙开放3306端口). 2)关闭selinux. 3)同步前,双方数据库中需要同步 ...