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

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直接将所有这些内容都视为字符串。然而,我想要根据它们的数字值首先进行排序,然后再根据数字后面的字符进行排序。

我该怎么做?


请查看此帖子(https://dev59.com/32ct5IYBdhLWcg3wvv9u),并定义一个自定义比较函数。 - lurker
2
这被称为自然排序。可能是Does Python have a built in function for string natural sort?的重复问题。 - Ashwini Chaudhary
2个回答

29

你想使用 自然排序

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:不可排序类型异常。


1
请注意,在Python 3中,所有项必须具有相似的结构。['a1','2b']将会出现TypeError错误。 - Steven Rumbalski
@StevenRumbalski:啊,我忘了那个。谢谢,我会提一下的。 - Claudiu

0

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

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

然后您可以将其用作排序键:

list1.sort(key=convert)

这里有一些更自然的排序解决方案:https://dev59.com/aG445IYBdhLWcg3we6V9 - nofinator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接