python-3.x 是否按字符串中的数字对字符串列表排序?

twh00eeo  于 2023-02-06  发布在  Python
关注(0)|答案(7)|浏览(194)

我有下面的字符串列表。然后,我想按每个元素中的数字对它进行排序。sorted失败了,因为它不能处理103之间的顺序。我可以想象如果我使用re,我可以做到这一点。但它并不有趣。你们有很好的实现想法吗?我想python 3.x可以实现这段代码。

names = [
'Test-1.model',
'Test-4.model',
'Test-6.model',
'Test-8.model',
'Test-10.model',
'Test-20.model'
]
number_sorted = get_number_sorted(names)
print(number_sorted)
'Test-20.model'
'Test-10.model'
'Test-8.model'
'Test-6.model'
'Test-4.model'
'Test-1.model'
mrzz3bfm

mrzz3bfm1#

关键是...关键

sorted(names, key=lambda x: int(x.partition('-')[2].partition('.')[0]))

通过将字符串的这一部分分离出来并将其转换为int,使其被识别为排序顺序。

xzabzqsa

xzabzqsa2#

一些替代方案:
(1)按位置切片:

sorted(names, key=lambda x: int(x[5:-6]))

(2)剥离子字符串:

sorted(names, key=lambda x: int(x.replace('Test-', '').replace('.model', '')))

或更好(Pandas版本〉3.9):

x.removeprefix('Test-').removesuffix('.model')

(3)拆分字符(也可以通过字符串分区):

sorted(names, key=lambda x: int(x.split('-')[1].split('.')[0]))

(4)在(1)-(3)中的任何一个上使用np. argsort进行Map:

list(map(names.__getitem__, np.argsort([int(x[5:-6]) for x in names])))
r1zk6ea1

r1zk6ea13#

我自己也发现了一个类似的问题和解决方案。Nonalphanumeric list order from os.listdir() in Python

import re
def sorted_alphanumeric(data):
    convert = lambda text: int(text) if text.isdigit() else text.lower()
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
    return sorted(data, key=alphanum_key, reverse=True)
z3yyvxxp

z3yyvxxp4#

您可以在中将re.findall与排序函数的key一起使用:

import re
names = [
 'Test-1.model',
 'Test-4.model',
 'Test-6.model',
 'Test-8.model',
 'Test-10.model',
 'Test-20.model'
]
final_data = sorted(names, key=lambda x:int(re.findall('(?<=Test-)\d+', x)[0]), reverse=True)

输出:

['Test-20.model', 'Test-10.model', 'Test-8.model', 'Test-6.model', 'Test-4.model', 'Test-1.model']
pw9qyyiw

pw9qyyiw5#

def find_between( s, first, last ):
    try:
        start = s.index( first ) + len( first )
        end = s.index( last, start )
        return s[start:end]
    except ValueError:
        return ""

然后做一些

sorted(names, key=lambda x: int(find_between(x, 'Test-', '.model')))
klsxnrf1

klsxnrf16#

您可以将key参数与sorted()一起使用来完成此操作,前提是每个字符串的格式都相同:

def get_number_sorted(somelist):
    return sorted(somelist, key=lambda x: int(x.split('.')[0].split('-')[1]))

看起来您可能希望列表反向排序(?),在这种情况下,您可以添加reverse=True如下:

def get_number_sorted(somelist):
    return sorted(somelist, key=lambda x: int(x.split('.')[0].split('-')[1]), reverse=True)
number_sorted = get_number_sorted(names)
print(number_sorted)
['Test-20.model', 'Test-10.model', 'Test-8.model', 'Test-6.model', 'Test-4.model', 'Test-1.model']

参见相关内容:关键功能

fjnneemd

fjnneemd7#

这是一个基于正则表达式的方法。我们可以从字符串中提取测试编号,转换为int型,然后按此排序。

import re

def grp(txt): 
    s = re.search(r'Test-(\d+)\.model', txt, re.IGNORECASE)
    if s:
        return int(s.group(1))
    else:
        return float('-inf')  # Sorts non-matching strings ahead of matching strings

names.sort(key=grp)

相关问题