本文实例讲述了Python筛选及提取序列中元素的方法。分享给大家供大家参考,具体如下:
问题:提取出序列中的值或者根据某些标准对序列做删减
解决方案:列表推导式、生成器表达式、使用内建的filter()
函数
1、列表推导式方法:存在一个潜在的缺点,如果输入数据非常大可能会产生一个庞大的结果,考虑到该问题,建议选择生成器表达式
1
2
3
4
5
6
7
8
|
# Examples of different ways to filter data
mylist = [ 1 , 4 , - 5 , 10 , - 7 , 2 , 3 , - 1 ]
print ( 'mylist=' ,mylist)
# 使用列表推导式
pos = [n for n in mylist if n > 0 ]
print ( '正数为:' ,pos)
neg = [n for n in mylist if n < 0 ]
print ( '负数为:' ,neg)
|
运行结果:
1
2
3
|
mylist = [ 1 , 4 , - 5 , 10 , - 7 , 2 , 3 , - 1 ]
正数为: [ 1 , 4 , 10 , 2 , 3 ]
负数为: [ - 5 , - 7 , - 1 ]
|
2、生成器表达式方法:
1
2
3
4
5
6
7
|
mylist = [ 1 , 4 , - 5 , 10 , - 7 , 2 , 3 , - 1 ]
print ( 'mylist=' ,mylist)
# 使用生成器表达式
pos = (n for n in mylist if n > 0 )
print ( '生成器为' ,pos)
for x in pos:
print (x)
|
运行结果:
1
2
3
4
5
6
7
|
mylist = [ 1 , 4 , - 5 , 10 , - 7 , 2 , 3 , - 1 ]
生成器为 <generator object <genexpr> at 0x02421FD0 >
1
4
10
2
3
|
3、如果筛选标准无法简单表示在列表推导式或者生成器表达式中,比如筛选过程涉及一些异常处理或者更复杂的细节,可以考虑将处理筛选逻辑的代码放到单独的函数中,然后使用内建的filter()函数处理。
1
2
3
4
5
6
7
8
9
|
values = [ '1' , '2' , '-3' , '-' , 'N/A' , '4' , '5' , '%' ]
def is_int(val): #将处理筛选逻辑的代码放到单独的函数
try :
x = int (val)
return True
except ValueError:
return False
ivals = list ( filter (is_int,values)) #使用filter(func,list)进行过滤
print (ivals)
|
运行结果:
1
|
[ '1' , '2' , '-3' , '4' , '5' ]
|
filter(func,list)
会创建一个迭代器,如果想要列表形式的结果,需使用list()
将结果转为列表。
补充:
用新值替换掉不满足标准的值,而不是丢弃它们,可通过将筛选条件移到一个条件表达式中来轻松实现。
1
2
3
4
5
6
7
|
# Negative values clipped to 0
neg_clip = [n if n > 0 else 0 for n in mylist]
print ( '负数替换为0,结果:' ,neg_clip)
# Positive values clipped to 0
pos_clip = [n if n < 0 else 0 for n in mylist]
print ( '正数替换为0,结果:' ,pos_clip)
'''
|
运行结果:
1
2
3
|
mylist = [ 1 , 4 , - 5 , 10 , - 7 , 2 , 3 , - 1 ]
负数替换为 0 ,结果: [ 1 , 4 , 0 , 10 , 0 , 2 , 3 , 0 ]
正数替换为 0 ,结果: [ 0 , 0 , - 5 , 0 , - 7 , 0 , 0 , - 1 ]
|
值得推荐的工具itertools.compress()
,它接受一个可迭代对象以及一个布尔选择器序列作为输入。
如果想把对一个序列的筛选结果施加到另一个相关的序列上时,就会非常有用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# 采用筛选工具itertools.compress()
addresses = [
'5412 N CLARK' ,
'5148 N CLARK' ,
'5800 E 58TH' ,
'2122 N CLARK' ,
'5645 N RAVENSWOOD' ,
'1060 W ADDISON' ,
'4801 N BROADWAY' ,
'1039 W GRANVILLE' ,
]
counts = [ 0 , 3 , 10 , 4 , 1 , 7 , 6 , 1 ]
from itertools import compress
more5 = [ n > 5 for n in counts ]
a = list (compress(addresses, more5))
print (a)
|
运行结果:
1
|
[ '5800 E 58TH' , '1060 W ADDISON' , '4801 N BROADWAY' ]
|
这里的关键是首先创建一个布尔序列,用来表示哪个元素可满足我们的条件。然后compress()
函数挑选出满足布尔值为True的相应元素。
同filter()
函数一样,正常情况下compress()
函数返回一个迭代器,若需要返回列表则需使用list()
将结果转为列表。
(代码摘自《Python Cookbook》)
希望本文所述对大家Python程序设计有所帮助。
原文链接:http://www.cnblogs.com/apple2016/p/5747529.html