赞
踩
实际案例:
(1)过滤掉列表 [3, 9, -1, 10, 20, -2 ...] 中的负数
(2)筛出字典 {'LiLei':79, 'Jim':88, 'Lucy':92 ...} 中值高于90的项
(3)筛出集合 {77, 89, 32, 20 ...} 中能被3整除的元素
注:最通用的一种做法就是迭代。
(1)过滤掉列表 [3, 9, -1, 10, 20, -2 ...] 中的负数
- # 方法一:通用做法迭代,过滤掉列表中负数
- data = [1, 5, -3, -2, 6, 0, 9]
- res = []
- for x in data:
- if x >= 0:
- res.append(x)
- print(res)
- # 输出结果:[1, 5, 6, 0, 9]
-
- # 方法二:函数式编程
- # 导入random,生成10个元素的随机列表
- from random import randint
- data = [randint(-10, 10) for _ in range(10)]
- # 打印过滤前列表
- print(data)
- # 打印过滤后的列表,注意filter的返回值是一个对象需要使用list()转换
- print(list(filter(lambda x: x >= 0, data)))
- # 输出结果:
- [5, -2, -2, 0, 6, 4, -7, -8, 7, 9]
- [5, 0, 6, 4, 7, 9]
-
- # 方法三:列表解析(首选)
- data = [1, 5, -3, -2, 6, 0, 9]
- print([x for x in data if x >= 0])
- # 输出结果: [1, 5, 6, 0, 9]
使用filter()函数式编程和列表解析哪种方式好?
可以用timeit.timeit()进行测试查看那种运行时间更短,列表解析方式运行时间大概是filter()函数式编程一半,所以列表解析更快一些。
(2)筛出字典 {'LiLei':79, 'Jim':88, 'Lucy':92 ...} 中值高于90的项
- from random import randint
-
- # 随机生成一个字典,20个人成绩
- d = {x: randint(60, 100) for x in range(1, 20)}
- print(d)
- # 字典解析,根据值过滤出分数高于90的同学,注:Python2使用iteritems()
- print({k: v for k, v in d.items() if v > 90})
- # 运行结果:
- {1: 64, 2: 65, 3: 78, 4: 74, 5: 68, 6: 95, 7: 66, 8: 83, 9: 77, 10: 83,
- 11: 84, 12: 74, 13: 83, 14: 75, 15: 99, 16: 93, 17: 87, 18: 80, 19: 74}
- {6: 95, 15: 99, 16: 93}
(3)筛出集合 {77, 89, 32, 20 ...} 中能被3整除的元素
- data = [5, -4, -10, -5, -5, 5, 2, 4, 3, -9]
- # 将列表转成集合
- s = set(data)
- print(s)
- # 集合解析,过滤出能被3整除的子集
- print({x for x in s if x % 3 == 0})
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。