首页 > 编程语言 >Python小技巧:一种字符串的排序方式

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

时间:2024-05-27 16:22:45浏览次数:24  
标签:n3 name Python num 字符串 n1 n2 排序

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

#学习中遇到问题没人解答?小编创建了一个Python学习交流群:153708845
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']

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

标签:n3,name,Python,num,字符串,n1,n2,排序
From: https://www.cnblogs.com/djdjdj123/p/18215828

相关文章

  • 拓扑排序问题
    拓扑排序的英文是Topologicalsorting,要解决的问题是,给定一个包含\(n\)个节点的有向图\(G\),给出所有节点的一种排列,使得对于图\(G\)中的任意一条有向边\((u,v)\),\(u\)在排列中都出现在\(v\)的前面,这样的排列称为图\(G\)的拓扑排序。从拓扑排序的定义中,可以得出两个结论:若图\(G\)......
  • Lua两个点号连接字符串
    在Lua中,两个点号..代表字符串连接操作符。当你想要将两个或多个字符串拼接在一起时,可以使用这个操作符。以下是使用..操作符的一些示例:localstr1="Hello,"localstr2="World!"localresult=str1..str2--结果为"Hello,World!"在这个例子中,str1和str2被......
  • 设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1
    题目:设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1值小的元素在前,大的在后;在k1值相同的情况下,再看k2,k2值小的在前,大的在后。满足这种要求的排序方法是()A.先按k1进行直接插入排序,再按k2进行简单选择排序B.先按k2进行直接插入排序,再按k1进行......
  • Python(四)——基础控制流程语句:简单用户登录和输出10以内的奇偶数
    例子1:编写一小段代码,输入正确的账号和密码实现登陆操作。利用input函数判断用户名和密码是否正确,正确输出“欢迎您!“,用户名默认admin,密码默认为123代码实现:username=input("请输入用户名:")password=input("请输入密码:")ifusername=="admin":ifpassword=="123......
  • Python可以声明并赋值一个hash类型变量吗?
    在Python中,不能直接声明一个变量为`hash`类型,因为Python是一种动态类型语言,不需要(也不能)在声明变量时指定其类型。变量的类型是根据赋给它的值自动推断的。将一个哈希值(即一个整数)赋值给一个变量,这个哈希值可以是通过调用内置`hash()`函数获得的任何对象的哈希值。例如:```pyt......
  • c++ 分割字符串
    #include"iostream"#include"vector"#include"string"usingnamespacestd;vector<string>split(stringtxt,stringsplitor){ vector<string>strList; constchar*arr=txt.c_str(); size_tlast=0; size_t......
  • python-装饰器
    装饰器基本样式defdecorator(func):defwrapper(*args,**kwargs):print("before")res=func(*args,**kwargs)print("after")returnresreturnwrapper@decoratordeffunc():print("hello&quo......
  • C++字符串string
    包含头文件:#include<string>C++string与C语言char*之间的相互转换str.c_str()std::string()字符串与float/int之间的相互转换字符串转int/float利用std::stoi将字符串转为整型/转为float型:std::stof,即string-to-floatint/float转字符串std::to_string()......
  • python模块之smtplib邮件处理模块
    要求:发送一封简单的邮件发送html格式的邮件在邮件中带图片发送邮件步骤:1.登录邮件服务器2.构造符合邮件协议规则的邮件内容3.发送python对SMTP支持有smtplib和email模块,email负责构造邮件,smtplib负责发送邮件importsmtplibfromemail.mime.textimportMIMETextf......
  • Python闭包和装饰器原理
    #Python闭包和装饰器#############闭包##############'''1.一个外层函数,内嵌一个内层函数;2.内层函数使用外层函数的参数;3.外层函数将内层函数作为返回值返回'''#外层函数defouter(msg):#内层函数definner():#内层函数使用外......