问题:序列中有一些数据,需要提出某些值,或者删除某些值
解决方案1:列表推导式(list comprehension)
示例1:
>>>mylist = [3,6,-1,2,-3]
>>>[n for n in mylist if n>0]
[3,6,3]
>>>[n for n in mylist if n<0]
[-1,-3]
列表推导式存在问题:如果原始输入很大,可能会产生庞大的结果
解决方案:使用生成器表达式通过迭代的方法筛选结果
示例2:
>>>pos = [n for n in mylist if n>0]
>>>pos
<generator object <genexpr> at ......
>>>for x in pos:
... print (x)
...
3
6
3
问题:有时候筛选的标准没法简单地表示在列表推导式或者生成器表达式中。
解决:将处理筛选逻辑的代码放到单独的函数中,然后使用内建的filter()函数处理
示例3:
values = ['1','2','-','4','N/A','no']
def is_int(val):
try:
x = int(val)
return True
except ValueError:
return False
ivals = list(filter(is_int,values))
print(ivals)
运行结果:
![](https://img.haomeiwen.com/i1692568/2a7f8937e7837ddb.png)
列表推导式和生成器表达式通常是用来筛选数据的最简单和最直接的方式,同时具有数据转换的能力。
示例4:
import math
mylist = [1,-1,2,-3,6]
print ([math.sqrt(n) for n in mylist if n>0])
![](https://img.haomeiwen.com/i1692568/abd15b8a0757fc55.png)
列表推导式还可以使用新值替换列表中不满足的值。
示例5:将mylist中小于0的数使用0替换
mylist = [1,-1,2,-3,6]
print ([n if n >0 else 0 for n in mylist])
![](https://img.haomeiwen.com/i1692568/0571833c5c6eb78c.png)
解决方案2:筛选工具itertools.compress()
输入:可迭代对象以及布尔选择器作
输出:所有布尔选择器中True的可迭代对象
作用:对一个序列的筛选结果施加到另一个相关序列施,非常有用
示例6:构建一个地址表,其中count值要大于5
address=['HuNan','FuJian','GuangXi','XiZang', 'HeBei', 'HeNan']
counts=[1,9,6,3,11,4]
more5 = [n>5 for n in counts]
print(more5)
print (list(compress(address, more5)))
![](https://img.haomeiwen.com/i1692568/0135f53b4a6a295c.png)
示例6的关键在于首先建立一个布尔序列,然后compress()函数挑选出布尔值为True的相应元素。
compress()返回一个迭代器,使用list()将结果转为列表。
网友评论