Python 按字符串末尾数字排序

11 投票
8 回答
12662 浏览
提问于 2025-04-16 07:50

如何简单地对一串字符串进行排序,这些字符串的末尾有数字,有的有3位数,有的有4位数:

>>> list = ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
>>> list.sort()
>>> print list
['asdf111', 'asdf123', 'asdf1234', 'asdf124']

应该把那个1234的放到最后。有没有简单的方法可以做到这一点?

8 个回答

2

你所描述的内容可能叫做 自然排序,或者说是人性化排序。如果你在用Python,可以参考一下 Ned的实现

自然排序的算法大致是这样的:

  • 把每个值分成字母“块”和数字“块”
  • 先根据每个值的第一个块进行排序
    • 如果这个块是字母,就像平常那样排序
    • 如果这个块是数字,就根据这个数字的大小来排序
  • 对于第一个块相同的值,再根据第二个块进行排序
  • 依此类推
22

有没有简单的方法可以做到这一点?

有的

你可以使用 natsort 这个模块。

>>> from natsort import natsorted
>>> natsorted(['asdf123', 'asdf1234', 'asdf111', 'asdf124'])
['asdf111', 'asdf123', 'asdf124', 'asdf1234']

坦白说,我是这个软件包的作者。

7

有没有简单的方法可以做到这一点?

没有

现在的规则完全不清楚。“有的有3位数字,有的有4位数字”并不是一个很准确或完整的说明。你给的所有例子前面都有4个字母。这是一直都这样吗?

import re
key_pat = re.compile(r"^(\D+)(\d+)$")
def key(item):
    m = key_pat.match(item)
    return m.group(1), int(m.group(2))

那个 key 函数可能能满足你的需求。或者它可能太复杂了。也许这个模式实际上是 r"^(.*)(\d{3,4})$",或者规则可能更加模糊。

>>> data= ['asdf123', 'asdf1234', 'asdf111', 'asdf124']
>>> data.sort( key=key )
>>> data
['asdf111', 'asdf123', 'asdf124', 'asdf1234']

撰写回答