Python:掩盖列表的优雅高效方法
发布于 2021-01-29 18:13:55
例:
from __future__ import division
import numpy as np
n = 8
"""masking lists"""
lst = range(n)
print lst
# the mask (filter)
msk = [(el>3) and (el<=6) for el in lst]
print msk
# use of the mask
print [lst[i] for i in xrange(len(lst)) if msk[i]]
"""masking arrays"""
ary = np.arange(n)
print ary
# the mask (filter)
msk = (ary>3)&(ary<=6)
print msk
# use of the mask
print ary[msk] # very elegant
结果是:
>>>
[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 "<interactive input>", line 1, in <module>
TypeError: only integer arrays with one element can be converted to an index
问题是要为list
s找到一个优雅的蒙版。
更新:
通过jamylak
引入的答案,compress
但是提出的要点Joel Cornett
使解决方案完全符合我的兴趣。
>>> mlist = MaskableList
>>> mlist(lst)[msk]
>>> [4, 5, 6]
关注者
0
被浏览
51
1 个回答
-
文档中的示例
相当于:
def compress(data, selectors): # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F return (d for d, s in izip(data, selectors) if s)