是否有一个内置函数可以一步对python列表进行排序和过滤?

时间:2010-12-20 17:39:20

标签: python

给定一个带有数字名称的文件目录,我目前分两步对目录列表进行排序和过滤。

#files = os.listdir(path)
files = ["0", "1", "10", "5", "2", "11", "4", "15", "18", "14", "7", "8", "9"]

firstFile =  5
lastFile  = 15

#filter out any files that are not in the desired range
files = filter(lambda f: int(f) >= firstFile and int(f) < lastFile, files)

#sort the remaining files by timestamp
files.sort(lambda a,b: cmp(int(a), int(b)))

是否有一个结合了过滤和排序操作的python函数,所以列表只需要迭代一次?

2 个答案:

答案 0 :(得分:20)

那些是正交的任务,我不认为它们应该是混合的。此外,很容易使用生成器表达式在一行中单独进行过滤和排序

files = sorted( (f for f in files if firstFile <= int(f) < lastFile), key=int)

答案 1 :(得分:0)

最简单的方法是(至少在2.6中)使用itertools.ifilter创建过滤生成器,然后对其进行排序:

>>> from itertools import ifilter
>>> seq = [ 1, 43, 2, 10, 11, 91, 201]
>>> gen = ifilter(lambda x: x % 2 == 1, seq)
>>> sorted(gen)
[1, 11, 43, 91, 201]

sorted开始迭代它之前,不会遍历和过滤基础序列。