给定一个带有数字名称的文件目录,我目前分两步对目录列表进行排序和过滤。
#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函数,所以列表只需要迭代一次?
答案 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
开始迭代它之前,不会遍历和过滤基础序列。