是否有内置函数一次性排序和过滤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
最简单的方法是(至少在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
开始遍历这个序列之前,底层的序列不会被遍历和过滤。
24
这些任务是相互独立的,我觉得不应该把它们混在一起。而且,用生成器表达式可以很简单地在一行代码中分别进行过滤和排序。
files = sorted( (f for f in files if firstFile <= int(f) < lastFile), key=int)