python - 如何按数字部分的升序对字符串列表进行排序

标签 python string list sorting numeric

我有一个路径列表,其中包含多个数字部分,这是其中的一部分:

'C:\\Python\\Python310\\Scripts\\mockup_test\\17mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\18mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\19mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\1mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\20mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\21mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\29mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\2mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\30mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\31mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\38mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\39mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\3mm.JPG'

使用 .sort() 不会改变它,因为它认为它已经排序了。

它应该是这样的:

预期结果:

'C:\\Python\\Python310\\Scripts\\mockup_test\\1mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\2mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\3mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\17mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\18mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\19mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\20mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\21mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\29mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\30mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\31mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\38mm.JPG',
'C:\\Python\\Python310\\Scripts\\mockup_test\\39mm.JPG'

有谁知道如何实现这一点吗?

最佳答案

以下内容按找到的字符串的所有部分对列表进行排序,其中连续数字部分被视为int,其他部分被视为str:

import re 

def split_str_int(s):
    a = re.split(r'(\d+)', s)
    a[1::2] = map(int, a[1::2])
    return a

newlist = sorted(mylist, key=split_str_int)

关于您的数据:

>>> newlist
['C:\\Python\\Python310\\Scripts\\mockup_test\\1mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\2mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\3mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\17mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\18mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\19mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\20mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\21mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\29mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\30mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\31mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\38mm.JPG',
 'C:\\Python\\Python310\\Scripts\\mockup_test\\39mm.JPG']

另请注意,上面的内容将根据字符串中找到的所有部分(数字和非数字)进行排序。这是为了遵守:“(...) 具有多个数字部分”。

例如:

mylist = [
    'ab6cd45',
    'ab6cd2',
    'a6cd3',
    'ab4cd60',
    'a',
]
>>> sorted(mylist, key=split_str_int)
['a', 'a6cd3', 'ab4cd60', 'ab6cd2', 'ab6cd45']

关于python - 如何按数字部分的升序对字符串列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72140420/

相关文章:

java - 如何将文件中的文本存储到变量中?

javascript - 如何组合数组中相同的字符串?

python数据框如何将集合列转换为列表

list - 如何在 SWI-Prolog 中扩展结果列表?

c++ - 在初始化列表c++中初始化类数组

python - 在 Python 中使用适当的类型提示对 Sequence 进行子类化

python - 新的 Google ReCAPTCHA 与 django-recaptcha

c# - .NET 中的字符串连接和线程

python - 防止测试代码因为参数不同而出现 "duplication"

python - GroupBy 总和作为开始和结束日期范围的比例