我创建了一个2D列表,并在the same type question之后在2D列表上应用了一个掩码。事实证明,发布的解决方案根本不适用于2D列表。 这是代码和输出:
from itertools import compress
class MaskableList(list):
def __getitem__(self, index):
try: return super(MaskableList, self).__getitem__(index)
except TypeError: return MaskableList(compress(self, index))
aa=[['t', 'v'], ['a', 'b']]
aa=MaskableList(aa)
print(aa)
>>> [['t', 'v'], ['a', 'b']]
mask1=[[1,0],[0,1]]
print(aa[mask1])
>>> [['t', 'v'], ['a', 'b']]
mask2=[1,0,0,1]
print(aa[mask2])
>>> [['t', 'v']]
它有一种干净有效的方法,可用于屏蔽2D列表。
答案 0 :(得分:3)
一种简单的方法就是重新实现itertools.compress
实现的生成器表达式。
您将其转换为语句,当在给定位置数据和选择器都是列表时,您可以在该子列表上递归新的压缩函数:
from collections import Iterable
def compress_rec(data, selectors):
for d, s in zip(data, selectors): # py3 zip is py2 izip, use itertools.zip_longest if both arrays do not have the same length
if isinstance(d, Iterable) and isinstance(s, Iterable):
yield compress_rec(d, s)
else:
yield d
这样它可以用于任何维数组。
HTH
答案 1 :(得分:2)
肯定有一个更好的解决方案涉及弄乱class
定义,但解决方法就是这样:
from itertools import compress
class MaskableList(list):
def __getitem__(self, index):
try:
return super(MaskableList, self).__getitem__(index)
except TypeError:
return MaskableList(compress(self, index))
aa = [['t', 'v'], ['a', 'b']]
mask1 = [[True, False], [False, True]]
new = [MaskableList(sublist)[submask] for sublist, submask in zip(aa, mask1)]
print(new) # -> [['t'], ['b']]