Python 带数字的字符串排序
HDUZN

当字符串中有数字的时候,想给字符串进行排序,不管用列表的sort()方法,还是sorted()方法,都一想,得到的结果会发现都不是我们想要的。

举个例子:

1
2
3
4
5
6
7
list1 = ['01', '11', '10', '21', '02']
list2 = ['学生2', '学生1', '学生10', '学生4']

list1.sort()
print(list1) # ['01', '02', '10', '11', '21']
list2.sort()
print(list2) # ['学生1', '学生10', '学生2', '学生4']

当给这样的列表中的字符串直接排序的时候,看print打印出来的结果,只有纯数字的字符串列表list1是正确的,list2和list3排完后都不是我们想要的结果。

比如list2的排序,排序前是:
list2 = ['学生2', '学生1', '学生10', '学生4']
排序完后是:
list2 = ['学生1', '学生10', '学生2', '学生4']

这里就需要用到sort()方法中的key参数了。

List sort()方法

功能:用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。
语法:list.sort(cmp=None, key=None, reverse=False)

cmp:可选参数, 如果指定了该参数会使用该参数的方法进行排序。
key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse:排序规则,reverse=True 降序, reverse=False 升序(默认)。

解决方法

1.使用匿名函数

代码如下 :

1
2
3
4
list2 = ['学生2', '学生1', '学生10', '学生4']

list2.sort(key=lambda customeSort: (customeSort[:2], int(customeSort[2:])))
print(list2) # ['学生1', '学生2', '学生4', '学生10']

使用匿名函数,customeSort指列表的数据。
如果不好理解,可以用下面的方法。

2.更清晰的写法

用这个方法,可以直接debug看一下,每一步做了什么。结果是一样的。

1
2
3
4
5
6
7
def customeSort(arr):
return arr[:2], int(arr[2:])

list2 = ['学生2', '学生1', '学生10', '学生4']

list2.sort(key=customeSort)
print(list2) # ['学生1', '学生2', '学生4', '学生10']

这个方法还有一个好处 ,比如上面的例子中,数字的起始坐标位置都是2,如果不是确定的就写起来更复杂一点了。但写出来一个函数,就看起来清晰一点了。

比如下面这个例子(明显,我是想按第一个_前面的数字排序一下,默认的排序出来是不对的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def customeSort(arr):
# 查看第一个'_'的位置
i = arr.index('_')
return int(arr[:i]), arr[i:]

list3 = ['00_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1',
'011_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1',
'010_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1',
'03_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1']

list3.sort(key=customeSort)
print(list3)
# list3排序后结果如下:
# ['00_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1',
# '03_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1',
# '010_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1',
# '011_gzc_1000035_0bc3riaguaaacmaebliogjqjlcwdnkfaa2sa.f304110.1']
  • 本文标题:Python 带数字的字符串排序
  • 本文作者:HDUZN
  • 创建时间:2022-11-29 21:11:32
  • 本文链接:http://hduzn.cn/2022/11/29/Python-带数字的字符串排序/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论