在保留原始类型的同时,根据另一个列表筛选列表

时间:2015-02-26 22:24:28

标签: python list filter list-comprehension

给定一个bool元素列表A和另一个长度相同的列表B,目标是基本上做一些事情

B = [B[i] for i in xrange(len(A)) if A[i]]

但是,有时B不是基本的python列表;例如,它可能使用manager.list()创建,其中managerManager()模块中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"这样做的方法?

1 个答案:

答案 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]
相关问题