我被要求定义一个基于文件扩展名对列表进行排序的函数。
我理解排序,但我不明白如何从"开始排序。"字符。
我想要以下结果:
>>> extsort(['a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'x.c'])
['a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']
答案 0 :(得分:4)
您可以将密钥功能作为sorted
的参数传递:
>>> l = ['a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'x.c']
>>> sorted(l, key=lambda x: splitext('.')[1])
['a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'x.c']
如果您需要具有相同扩展名的文件按名称排序,您可以更改键功能以反转拆分结果:
>>> l = ['x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'a.c']
>>> sorted(l, key=lambda x: splitext(x)[::-1])
['a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']
答案 1 :(得分:3)
对于即使某些文件没有扩展名而且有更多自我记录功能的解决方案,请使用os.path.splitext
作为sorted
key
的一部分功能。如果没有文件扩展名,则会将扩展名视为空字符串''
,并在所有其他扩展名之前对其进行排序:
>>> l = ['b.py', 'a.c', 'a.py', 'bar.txt', 'foo.txt', 'x.c', 'foo']
>>> sorted(l, key=lambda x: os.path.splitext(x)[1])
['foo', 'a.c', 'x.c', 'b.py', 'a.py', 'bar.txt', 'foo.txt']
请注意,b.py
在a.py
之前排序,因为它首先出现在输入中,而排序仅限于文件扩展名。要使其按扩展名排序,然后使用全名,键入扩展名的元组,后跟非扩展名称(通过使用os.path.splitext
切换[::-1]
的返回值,可以轻松完成,从而颠倒顺序返回的元素),因此a.py
在b.py
之前,无论它们出现在输入中的哪个位置:
>>> sorted(l, key=lambda x: os.path.splitext(x)[::-1])
['foo', 'a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']