2016-06-07 81 views
0

我被要求定义一个基于文件扩展名排序列表的函数。如何按每个元素中的特定字符对列表进行排序?

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

我想以下结果:

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

读了关于'key'参数 –

+0

看看排序并提供一个分析和反转文件名和扩展名lambda函数所以用file.ext回报分机开始。lambda中的.file。这适用于John Coleman的产品。 'l = ['x.c','a.py','b.py','bar.txt','foo.txt','a.c']' – LhasaDad

回答

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

',我想你的解决方案不是对。输出是'['x.c','a.c','a.py','b.py','bar.txt','foo.txt']',我想thr作者想''[ 'a.c','x.c','a.py','b.py','bar.txt','foo.txt']'。 – BlackMamba

+0

好的我只看到一个问题。[1]在lambda函数末尾指定了什么? – Este

+0

@BlackMamba嗯,可能。 OP没有指定*给定扩展名内的值*是否必须进行排序。 – SethMMorton

3

对于解决方案即使某些文件没有扩展名(并且有些更自我记录),也可以使用os.path.splitext作为sortedkey函数的一部分。当没有文件扩展名,它将把扩展为空字符串,'',所有其他扩展之前,分类整理:

>>> 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前整理在这里,因为它第一次出现在输入端,该排序仅在文件扩展名上键入。要按扩展名进行排序,然后输入全名,键入扩展名的元组后面跟非扩展名(可通过使用[::-1]os.path.splitext进行分段返回值来轻松完成),因此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'] 
相关问题