14

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

list1 = ["1", "100A", "342B", "2C", "132", "36", "302F"]

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

list1 = ["1", "2C", "36", "100A", "132", "302F", "342B"]

只是这样做list1.sort()显然不会给出正确的答案 - 它给出了:

list1 = ["1", "100A", "132", "2C", "36", "302F", "342B"]

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

我该如何进行?

非常感谢 :)

4

2 回答 2

25

你想使用自然排序

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

示例用法:

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

此功能通过将元素拆分为列表来分离数字并将它们作为整数而不是字符串进行比较:

>>> natural_sort_key("100A")
['', 100, 'a']
>>> natural_sort_key("342B")
['', 342, 'b']

请注意,这仅适用于 Python3,如果您总是将整数与整数和字符串与字符串进行比较,否则会出现TypeError: unorderable types异常。

于 2013-10-14T18:25:12.280 回答
0

好吧,您必须首先找到一种将字符串转换为数字的方法。例如

import re
def convert(str):
    return int("".join(re.findall("\d*", str)))

然后将其用作排序键:

list1.sort(key=convert)
于 2013-10-14T18:24:50.863 回答