实际案例:
(1)过滤掉列表 [3, 9, -1, 10, 20, -2 ...] 中的负数
(2)筛出字典 {'LiLei':79, 'Jim':88, 'Lucy':92 ...} 中值高于90的项
(3)筛出集合 {77, 89, 32, 20 ...} 中能被3整除的元素
注:最通用的一种做法就是迭代。
2、代码演示(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})
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)