如何在列表元素中先按字母表排序,然后按数字排序

2024-10-03 02:45:02 发布

您现在位置:Python中文网/ 问答频道 /正文

有人知道如何将行排序到[“D9”、“D10”、“E9P”、“E10P”]吗? 我想先按前面的字母表排序,然后按里面的数字排序。你知道吗

In [2]: rows
Out[2]: ['D10', 'D9', 'E9P', 'E10P']

In [3]: sorted(rows)
Out[3]: ['D10', 'D9', 'E10P', 'E9P']


1. I can sort 9 ahead of 10 like this.
In [9]: sorted(rows, key=lambda row: int(re.search('(\d+)', row, re.IGNORECASE).group(1)))
Out[9]: ['D9', 'E9P', 'D10', 'E10P']

2. This doesn't work for me
In [10]: sorted(rows, key=lambda row: (row, int(re.search('(\d+)', row, re.IGNORECASE).group(1))))
Out[10]: ['D10', 'D9', 'E10P', 'E9P']

Tags: lambdakeyinresearch排序outrows
3条回答

你可以做:

lst = ["D9", "D10", "E9P", "E10P"]

def keys(val):
    first = val[0]
    number = int(''.join(filter(str.isdigit, val)))
    return first,  number 

result = sorted(lst, key=keys)
print(result)

输出

['D9', 'D10', 'E9P', 'E10P']

或者如果您想使用regex:

def keys(val):
    first = val[0]
    number = int(re.search('\d+', val).group())
    return first, number

或者也可以使用正则表达式:

def keys(val):
    alpha, digits = re.search('^([^\d]+)(\d+)', val).groups()
    return alpha, int(digits)

最后一个函数的优点是它可以在字符串的开头容纳多个非数字字符。你知道吗

这将采取任何数量的字符在前面,和任何数量的数字之后。你知道吗

def key(x):
    alpha, num_str = re.match(r'([A-Z]+)(\d+)', x).groups()
    num = int(num_str)
    return (alpha, num)

>>> sorted(["AC40", "AB55", "D9", "D10", "E9P", "E10P"], key=key)
['AB55', 'AC40', 'D9', 'D10', 'E9P', 'E10P']

扩展已有的内容,可以使用row[0]而不是row作为主排序键

In [8]: sorted(rows, key=lambda row: (row[0], int(re.search('(\d+)', row, re.IGNORECASE).group(1))))
Out[8]: ['D9', 'D10', 'E9P', 'E10P']

相关问题 更多 >