在python中排序 - 如何对包含字母数字值的列表进行排序?

Ran*_*ser 10 python sorting python-2.7 python-3.x

我有一个包含以下详细信息的列表:

list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"]
Run Code Online (Sandbox Code Playgroud)

现在,我想对此列表进行排序,以使值按以下顺序排列:

list1 = ["1", "2C", "36", "100A", "132", "302F", "342B"]
Run Code Online (Sandbox Code Playgroud)

只是list1.sort()显然没有给出正确的答案 - 它给出:

list1 = ["1", "100A", "132", "2C", "36", "302F", "342B"]
Run Code Online (Sandbox Code Playgroud)

我假设这是因为python直接将所有这些视为字符串.但是,我想根据它们的数值FIRST对它们进行排序,然后根据数字后面的字符对它们进行排序.

我该怎么办?

非常感谢 :)

Cla*_*diu 15

你想使用自然排序:

import re

_nsre = re.compile('([0-9]+)')
def natural_sort_key(s):
    return [int(text) if text.isdigit() else text.lower()
            for text in re.split(_nsre, s)]   
Run Code Online (Sandbox Code Playgroud)

用法示例:

>>> list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"]
>>> list1.sort(key=natural_sort_key)
>>> list1
['1', '2C', '36', '100A', '132', '302F', '342B']
Run Code Online (Sandbox Code Playgroud)

这通过将元素拆分为分隔数字并将它们作为整数而不是字符串进行比较的列表来实现:

>>> natural_sort_key("100A")
['', 100, 'a']
>>> natural_sort_key("342B")
['', 342, 'b']
Run Code Online (Sandbox Code Playgroud)

请注意,这只适用于Python3,如果您始终将int与int和字符串与字符串进行比较,否则会出现TypeError: unorderable types异常.