实际问题 过滤列表中的负数 筛选出字典种值高于90的项 筛选出集合种能被3整出的元素 围绕上面三个问题我们来进行讨论,比如下面有一个列表: >>> from random import randint >>> li = [randint(-10, 10) for _ in range(10)] >>> li [-10, -9, 1, 10, -3, -7, -6, -7, 4, -5] 我们常规的做法就是通过 for 循环对列表中的每一个值进行迭代,然后判断如果值大于等于0,就确定这个值是一个整数,否则就丢弃,比如下面的代码: >>> result = [] >>> for n in li: # 如果这个元素大于等于0 ... if n >= 0: # 加入的result列表中 ... result.append(n) ... >>> result [1, 10, 4] 实例 本篇所有的代码均在 Python 3.5.x 种运行,如果你使用的是 python 2.7.x ,那么请自行测试,在此之前,请导入一下模块用于测试: # 用于生成随机数 >>> from random import randint # 准确测量小段代码的执行时间 >>> import timeit 请仔细阅读下面的代码,看完后你将会有不一样的收获。 列表 filter函数 生成一个随机列表 >>> li = [randint(-10, 10) for _ in range(10)] >>> li [6, -8, 9, 3, 3, 8, 9, -4, 9, -6] # x=列表中的一个元素,有多少个元素就迭代多少次 >>> result = filter(lambda x: x >=0, li) >>> for n in result: ... print(n) ... 6 9 3 3 8 9 9 列表解析 生成一个随机列表 >>> li = [randint(-10, 10) for _ in range(10)] >>> li [8, -5, -2, 8, 9, 4, -6, -5, 5, 4] >>> [x for x in li if x >=0 ] [8, 8, 9, 4, 5, 4] filter与列表解析性能对比 使用 filter 执行时间 >>> timeit.Timer('filter(lambda x: x >=0, [4, -1, 1, 3, -10, 5, -8, 0, 6, 3])').timeit() 0.38938787838583266 使用 列表解析 执行时间 >>> timeit.Timer('[x for x in [4, -1, 1, 3, -10, 5, -8, 0, 6, 3] if x >=0 ]').timeit() 1.1142896312373978 通过以上的测试可以看出 filter 的执行时间明显比 列表解析 要快些,当然这并不是一个非常准确的数字,还是有待考察的。 |