我有一个包含文件名的python列表,如下所示:[name1, name10, name11, name2, name3, ..., name9]
。
我希望它像[name1, name2, name3, ..., name10, name11]
一样排序。
我该怎么做?
我知道我可以使用特殊的键功能(sorted(files, key=lambda name: etc.)
),但我不确定要应用哪个功能。
感谢您的帮助!
答案 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']