【问题标题】:Filter a list based on another list while keeping the original type根据另一个列表过滤一个列表,同时保留原始类型
【发布时间】:2015-02-26 22:24:27
【问题描述】:

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

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

然而,有时B 并不是一个基本的python 列表;例如,它可能使用manager.list() 创建,其中managermultiprocessing 模块中Manager() 的一个实例。上面的列表推导会把它变成一个普通的列表,这将失去想要的功能(在子进程之间共享数据)。

我想出的是类似的东西

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”的方式来做到这一点?

【问题讨论】:

标签: python list filter list-comprehension


【解决方案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]

【讨论】:

  • 如果 init 需要两个或更多参数,这将不起作用。而且我猜拳头A应该是B,对吧?
  • 查看我的建议,它应该适用于 manager.listlist ...
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多