Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在列表元素中先按字母表排序,然后按数字排序_Python - Fatal编程技术网

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

Python 如何在列表元素中先按字母表排序,然后按数字排序,python,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: i

有人知道如何将行排序为[“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']

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

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

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']
或者,如果要使用正则表达式:

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']

这很好。这里有一个关于这个的例子,如果在第一个数字之前有多个字母,这可能会失败,因为这只看第一个字母。非常感谢,fuglede SyntaxVoid,也谢谢你。我会更仔细地考虑这个问题。回答得好。但是,我不会使用名称
sort
作为函数名