Python 如何在列表元素中先按字母表排序,然后按数字排序
有人知道如何将行排序为[“D9”、“D10”、“E9P”、“E10P”]? 我想先按前面的字母表排序,然后按里面的数字排序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
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
作为函数名