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

时间:2013-10-14 18:16:34

标签: python sorting python-2.7 python-3.x

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

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直接将所有这些视为字符串。 但是,我想根据它们的数值FIRST,然后是数字后面的字符对它们进行排序。

我该如何处理?

非常感谢你:)

2 个答案:

答案 0 :(得分:15)

您想使用natural sort

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,如果你总是将int与int和字符串与字符串进行比较,否则会得到TypeError: unorderable types异常。

答案 1 :(得分:0)

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

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

然后将其用作排序键:

list1.sort(key=convert)