Python小技巧:一种字符串的排序方式

简介: Python小技巧:一种字符串的排序方式

1.排序方式

假设有一个序列,数据为:['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23'],

排序后需要达到这个效果:['n1', 'n2', 'n3', 'n10', 'n11', 'n13', 'n20', 'n21', 'n23']。

最开始当然想的是使用内建函数sorted()进行排序,但效果如下:

l = ['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23']
for item in sorted(l):
    print (item+' ', end='')

运行结果:

n1 n10 n11 n13 n2 n20 n21 n23 n3

很明显,没有达到我们想要的效果,后来上网查资料,发现这篇博客写的可以用来参考,地址:python 根据字符串内数字排序。

实现的思想是通过自定义排序的方式来实现,代码如下,在代码中,使用正则表达式匹配字符串尾部的数字。

import os
import sys
import re

def sort_key(s):
    if s:
        try:
            suffix = re.search('\d+$', s)
            num = int(suffix.group())
        except:
            num = -1
        return num

def strsort(alist):
    alist.sort(key=sort_key)
    return alist


if __name__ == "__main__":
    l = ['n1', 'n2', 'n10', 'n11', 'n21', 'n3', 'n13', 'n20', 'n23']
    sl = strsort(l)
    print (sl)

输出结果:

['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的,所以能够实现上述的排序结果。

import os
import sys
import re

def sort_key(s):
    if s:
        try:
            prefix = re.match('n\d+', s)
            suffix = re.search('\d+$', s)
            if prefix != None:
                prefix_num = int(prefix.group()[1:])
            else:
                prefix_num = -1
            if suffix != None:
                suffix_num = int(suffix.group())
            else:
                suffix = -1
            num = prefix_num * 255 + suffix_num
        except:
            num = -1
        return num

def strsort(alist):
    alist.sort(key=sort_key)
    return alist

if __name__ == "__main__":
    l_raw = ["n1_name_n1", "n2_name_n2", "n1_name_n3", "n2_name_n1", "n3_name_n1", "n3_name_n2"]
    l_sorted = strsort(l_raw)
    print (l_sorted)

输出结果:

 ['n1_name_n1', 'n1_name_n3', 'n2_name_n1', 'n2_name_n2', 'n3_name_n1', 'n3_name_n2']

这种思想,还可以用来处理多种条件下的排序,还是挺好用的

相关文章
|
9天前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
85 0
|
27天前
|
Python
Python中的f-string:更优雅的字符串格式化
Python中的f-string:更优雅的字符串格式化
211 100
|
27天前
|
开发者 Python
Python中的f-string:高效字符串格式化的利器
Python中的f-string:高效字符串格式化的利器
275 99
|
1月前
|
Python
Python中的f-string:更优雅的字符串格式化
Python中的f-string:更优雅的字符串格式化
|
1月前
|
开发者 Python
Python f-strings:更优雅的字符串格式化技巧
Python f-strings:更优雅的字符串格式化技巧
|
1月前
|
开发者 Python
Python f-string:高效字符串格式化的艺术
Python f-string:高效字符串格式化的艺术
|
1月前
|
Python
使用Python f-strings实现更优雅的字符串格式化
使用Python f-strings实现更优雅的字符串格式化
|
9天前
|
存储 Java 索引
(Python基础)新时代语言!一起学习Python吧!(二):字符编码由来;Python字符串、字符串格式化;list集合和tuple元组区别
字符编码 我们要清楚,计算机最开始的表达都是由二进制而来 我们要想通过二进制来表示我们熟知的字符看看以下的变化 例如: 1 的二进制编码为 0000 0001 我们通过A这个字符,让其在计算机内部存储(现如今,A 字符在地址通常表示为65) 现在拿A举例: 在计算机内部 A字符,它本身表示为 65这个数,在计算机底层会转为二进制码 也意味着A字符在底层表示为 1000001 通过这样的字符表示进行转换,逐步发展为拥有127个字符的编码存储到计算机中,这个编码表也被称为ASCII编码。 但随时代变迁,ASCII编码逐渐暴露短板,全球有上百种语言,光是ASCII编码并不能够满足需求
72 3
|
1月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
202 102

推荐镜像

更多
下一篇
oss教程