如何按每个元素中的特定字符对列表进行排序?

时间:2016-06-07 02:14:17

标签: python list function sorting sorted

我被要求定义一个基于文件扩展名对列表进行排序的函数。

我理解排序,但我不明白如何从"开始排序。"字符。

我想要以下结果:

>>> 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']

2 个答案:

答案 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.pya.py之前排序,因为它首先出现在输入中,而排序仅限于文件扩展名。要使其按扩展名排序,然后使用全名,键入扩展名的元组,后跟非扩展名称(通过使用os.path.splitext切换[::-1]的返回值,可以轻松完成,从而颠倒顺序返回的元素),因此a.pyb.py之前,无论它们出现在输入中的哪个位置:

>>> sorted(l, key=lambda x: os.path.splitext(x)[::-1])
['foo', 'a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']