0.摘要
本文主要介绍根据给定条件对列表中的元素进行筛序,剔除异常数据,并介绍列表推导式和生成表达式两种方法。。
1.列表推导式(list comprehension)
mylist = [1, 2, 3, -4, -5, 6, 7, 8, 9]
positive_list = [n for n in mylist if n > 0 ]
print(positive_list)
Out[12]:
[1, 2, 3, 6, 7, 8, 9]
优点:简单。列表推导式的实现非常简单,在数据量不大的情况下很实用。
缺点:占用内存大。由于列表推导式采用for循环一次性处理所有数据,当原始输入非常大的情况下,需要占用大量的内存空间。
2.生成器表达式
mylist = [1, 2, 3, -4, -5, 6, 7, 8, 9]
pos = (n for n in mylist if n > 0 )
print(pos)
for x in pos:
print(x)
Out[13]:
at 0x00000000059FF948>
1
2
3
6
7
8
9
其中的pos是我们构建的一个生成器,通过print()函数可以证实:
at 0x000000DD6A9D0200>
相比于列表推导式,生成器表达式每次只处理一个数据,而不是处理整个数据结构,因此更加节约内存。
结论:处理少量数据用列表推导式,处理大量数据用生成器表达式
3.更复杂的筛选条件
有的时候筛选的标准并非如此简单,甚至涉及到异常处理等细节,这个时候可以先将复杂的筛选条件写入函数,该函数返回bool值,然后利用Python内建filter()函数进行处理。
values = ['1','-123', 'N/A', '-', '+369', 'hello']
def is_int(val):
try:
x = int(val)
return True
except ValueError:
return False
ivals = list(filter(is_int, values))
print(ivals)
Out[14]:
['1', '-123', '+369']
利用int()转换函数和异常处理函数实现的对int型数据的判断;
filter()函数创建了一个迭代器,前面的list是将该迭代器转换为list数据。
4.实用操作
在使用列表推导式和生成器表达式筛选数据的过程,还可以附带着进行数据的处理工作。
mylist = [1, 4, -5, 10, -7, 2, 3, -1]
neg_clip = [n**2 if n > 0 else 0 for n in mylist]
print(neg_clip)
#result:[1, 16, 0, 100, 0, 4, 9, 0]
import math
pos_clip = [n if n < 0 else math.sqrt(n) for n in mylist]
print(pos_clip)
Out[16]:
[1, 16, 0, 100, 0, 4, 9, 0]
[1.0, 2.0, -5, 3.1622776601683795, -7, 1.4142135623730951, 1.7320508075688772, -1]
另外,介绍一个筛选工具: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 ]
print(more5)
a = list(compress(addresses, more5))
print(a)
Out[17]:
[False, False, True, False, False, True, True, False]
['5800 E 58TH', '1060 W ADDISON', '4801 N BROADWAY']
这里的 more5 将大于5的值替换为 True,其余替换为 False。
itertools.compress(data, selectors):该函数会根据selectors中元素的bool值筛选data对应位置的元素,并返回一个迭代器。因此,需要对返回值取list才能查看结果。
相比于filter()函数,itertools.compress() 形式更简单,不需要构建额外的函数。