Python:优雅且高效的屏蔽列表的方法

8 浏览
0 Comments

Python:优雅且高效的屏蔽列表的方法

示例:

from __future__ import division
import numpy as np
n = 8
"""掩码列表"""
lst = range(n)
print lst
# 掩码(过滤器)
msk = [(el>3) and (el<=6) for el in lst]
print msk
# 使用掩码
print [lst[i] for i in xrange(len(lst)) if msk[i]]
"""掩码数组"""
ary = np.arange(n)
print ary
# 掩码(过滤器)
msk = (ary>3)&(ary<=6)
print msk
# 使用掩码
print ary[msk]                          # 非常优雅

结果如下:

>>> 
[0, 1, 2, 3, 4, 5, 6, 7]
[False, False, False, False, True, True, True, False]
[4, 5, 6]
[0 1 2 3 4 5 6 7]
[False False False False  True  True  True False]
[4 5 6]

正如您所看到的,与列表相比,数组的掩码操作更加优雅。如果您尝试在列表上使用数组掩码方案,您将会得到一个错误:

>>> lst[msk]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: only integer arrays with one element can be converted to an index

问题是找到一种优雅的用于列表的掩码方法。

更新:

接受了jamylak提出的compress的答案,但是Joel Cornett提到的要点使得解决方案符合我感兴趣的期望形式。

>>> mlist = MaskableList
>>> mlist(lst)[msk]
>>> [4, 5, 6]

0