2-1 如何在列表,字典和集合中根据条件筛选数据
实际案例:
1.过滤列表[1,2,3,-6,-2,7,9,10]中的负数。
初级方法
data=[1,2,3,-2,2,-6,8]
res=[]
for x in data:
if x>=0:
res.append(x)
print(res)
filter 函数
from random import randint
data=[randint(-10,10) for _ in range(10)]
print(data)
data1=list(filter(lambda x: x >= 0, data))
print(data1)
Notice 上面的代码中,randint 随机生成10个范围在-10到10之间的数。
filter 的第一个参数是用来筛选的函数,依次迭代传入的参数,然后被函数进行判断,返回布尔值,如果布尔值为真,则将这个值返回到最终的值,如果为假,就过滤掉。第二个参数是被筛选的数据在这里我们使用匿名函数来创建函数,筛选完之后的值要转换成列表才能进行输出。
列表解析:
from random import randint
data=[randint(-10,10) for _ in range(10)] #创建列表为[]
data1=[x for x in data if x >= 0]
print(data1)
列表解析和filter 函数比较,使用timeit 函数来对两个方法的运行时间进行计算:
timeit [x for x in data if x >= 0]
timeit filter(lambda x:x >= 0, data)
Notice 认为列表解析更快一点,我们首选的是列表解析。
2.对于字典中删除某些值对应的元素
示例:首先我们创建一个字典,键是20个同学的学号,值是每个同学的考试成绩。然后我们要根据值来筛选成绩在90分以上的同学。
from random import randint
d={x: randint(60,100) for x in range(1,21)}
print(d)
dd={k:v for k,v in d.items if v > 90}
print(dd)
Notice 字典解析中的一个重要方法是items() 和iteritems :
items :将字典中所有的项,以列表的方式返回。因为字典是无序的,所有items 返回的项也是无序的。
iteritems :与items 的方法相同,但是返回的不是列表,而是迭代器。iteritems 方法在需要迭代结果的时候使用最合适,而且它的工作效率非常高。
总结:在Python2.x中,iteritems() 用于返回本身字典列表操作后的迭代器【Returns an iterator on all items(key/value pairs) 】,不占用额外的内存。
在Python 3.x 里面,iteritems()方法已经废