给定一个bool元素列表A
和另一个长度相同的列表B
,目标是基本上做一些事情
B = [B[i] for i in xrange(len(A)) if A[i]]
但是,有时B
不是基本的python列表;例如,它可能使用manager.list()
创建,其中manager
是Manager()
模块中multiprocessing
的实例。上面的列表理解将把它变成一个普通的列表,它将失去所需的功能(在子进程之间共享数据)。
我想出的是
def my_filter(A, B):
c = 0
for i in xrange(len(A)):
if not A[i]:
B.pop(i-c)
c = c + 1
以便my_filter(A, B)
将B
转换为A
元素为True
的子列表。
然而,这有点"丑陋"。还有更多" pythonic"这样做的方法?
答案 0 :(得分:1)
也许是这样的?
B = B.__class__([itemB for itemA,itemB in zip(A,B) if itemA])
或者可能更好
B[:] = [itemB for itemA,itemB in zip(A,B) if itemA]