python自定义排序列表1/2/3 /../ 9/10

时间:2015-05-29 08:30:11

标签: python list sorting

我有一个包含文件名的python列表,如下所示:[name1, name10, name11, name2, name3, ..., name9]

我希望它像[name1, name2, name3, ..., name10, name11]一样排序。

我该怎么做?

我知道我可以使用特殊的键功能(sorted(files, key=lambda name: etc.)),但我不确定要应用哪个功能。

感谢您的帮助!

7 个答案:

答案 0 :(得分:3)

尝试使用名为natsort自然字符串排序的第三方库。

>>> import natsort
>>> my_list = [...]
>>> natsort.natsorted(my_list)

您还可以使用key参数指定用于排序的键。

>>> natsort.natsorted(my_list, key=lambda x: ...)

答案 1 :(得分:3)

试试这个:

sorted(aList, key= lambda x: (lambda a, _, b: (a, int(b)) if b.isdigit() else (float("inf"), x))(*x.partition(" ")))

这将按照您的要求运作。此外,它不需要任何第三方库。

答案 2 :(得分:2)

您搜索的是The alphanum algorithm(有时也称为自然排序)。我链接的网站有多种语言的实现,甚至是python中的一种。

答案 3 :(得分:2)

import re

l = ["name1", "name10", "name 11", "name2"]
convert = lambda text: int(text) if text.isdigit() else text.lower() 
alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
print sorted(l, key = alphanum_key)

输出:['name1', 'name2', 'name10', 'name 11']

答案 4 :(得分:2)

如果您正在寻找与sorted函数一起使用的lambda表达式,并且知道您的条目的格式为“nameXXXXX”:

sorted(names, key=lambda name: int(name[4:]))

答案 5 :(得分:1)

我想我明白了。 给出一个列表[name1, name10, name11, name2, name3, ..., name9]

sorted(list, key = lambda name: int(name[4:]))

它会删除4个字符,因为name长度为4个字符,然后按剩余的数字排序。

答案 6 :(得分:1)

这是完成工作的代码示例。它不是最优的,但它易于理解,并让您深入了解这一特定排序问题解决方案背后的逻辑。

mylist = ['name1', 'name2', 'name3', 'name10', 'name11']
sorted_list = []

for n in range(100): #this gives you the order
    for item in mylist:
        if int(item[4:]) == n:
            sorted_list.append(item)

print(sorted_list)

将输出:

['name1', 'name2', 'name3', 'name10', 'name11']