用字母+数字等格式的元素重新排序列表



我想订购一个包含以下元素的列表:

a = ['A1', 'A2', 'A11', 'A12', 'A3', 'B1', 'B12', 'EC21', 'EC1']

如果我做

a.sort()

输出为

['A1', 'A11', 'A12', 'A2', 'A3', 'B1', 'B12', 'EC1', 'EC21']

而理想的输出是

['A1', 'A2', 'A3', 'A11', 'A12', 'B1', 'B12', 'EC1', 'EC21']

有什么想法吗?

这里的问题是,默认情况下,您正在对字符串进行排序,因此,从计算的角度来看,您在示例中显示的排序确实是正确的。

另一方面,您想要获得的结果需要忽略前缀(在您的示例"A"中(,将其余部分视为整数,并对该部分应用排序。

可以使用Python的排序键参数编写一个可能的解决方案

def my_function(e):
return int(e.split('A')[1])
a = ['A1', 'A2', 'A11', 'A12', 'A3']
a.sort(key=my_function)

输出:

['A1', 'A2', 'A3', 'A11', 'A12']

如果你的前缀可以不同于";A";你可以使用RegEx来适应所有的情况,如果这是一个要求,请告诉我,这样我就可以调整我的例子。

您可以在这里的Python官方文档中阅读更多关于该主题的内容,但为了简单起见,我也会在这个答案中复制相关部分:

键参数的值应该是一个函数(或其他可调用(,它接受单个参数并返回用于排序目的。这种技术很快,因为关键功能是对每个输入记录只调用一次。

用户更改问题并添加评论后编辑
请尝试此解决方案,我使用RegEx拆分了字母和数字,并分别订购:

import re
unsorted_list = ['A1', 'A11', 'A12', 'A2', 'A3', 'B1', 'B12', 'EC1', 'EC21']
expected_result = ['A1', 'A2', 'A3', 'A11', 'A12', 'B1', 'B12', 'EC1', 'EC21']
unsorted_dict = {}
for item in unsorted_list:
match = re.match(r"([A-Z]+)([0-9]+)", item, re.I)
letters_in_item = match.groups()[0]
numbers_in_item = int(match.groups()[1])
if letters_in_item in unsorted_dict:
unsorted_dict[letters_in_item].append(numbers_in_item)
else:
unsorted_dict[letters_in_item] = [numbers_in_item]
sorted_dict = dict(sorted(unsorted_dict.items()))
result = []
for key in sorted_dict:
for value in sorted(sorted_dict[key]):
result.append(key + str(value))
assert result == expected_result
a.sort(key=len)

在这里,我们添加了参数键,这意味着该函数将应用于每个列表项,然后进行排序。因此,列表也是根据每个元素的长度进行排序的。

最新更新