python过滤器并列出并将“过滤的索引”应用于另一个列表

时间:2012-11-15 12:16:02

标签: python

  

可能重复:
  Python: Elegant and efficient ways to mask a list

我有两个相同大小的列表,例如:

a=["alpha","beta","kappa","gamma","lambda"]
b=[1,2,None,3,4,5]

我想要做的是识别并删除list [b]中的none元素,然后删除list [a]中的相应元素。例如,我想删除none和“kappa”。

我知道:

过滤器(布尔,B)

会从[b]中删除None元素,但是,如何删除列表[a]中的相应条目?

我尝试拉链,类似的东西(想法是打包和打开包装):

a=["a","b","c","d","e"]
b=[1,2,None,3,4]
c=zip(a,b)
d=filter(bool,c)

..但这不起作用。 [d]仍然没有元素。

我很感激任何pythonic方法来实现这一点。

3 个答案:

答案 0 :(得分:8)

这可以通过itertools.compress()list comprehension

整齐地完成
>>> a=["a", "b", "c", "d", "e"]
>>> b=[1, 2, None, 3, 4]
>>> selectors = [x is not None for x in b]
>>> list(itertools.compress(a, selectors))
['a', 'b', 'd', 'e']
>>> list(itertools.compress(b, selectors))
[1, 2, 3, 4]

此方法意味着您只生成一次选择器(并且itertools.compress()应该很好而且快速)。

答案 1 :(得分:7)

a = [a[i] for i,v in enumerate(a) if b[i] is not None]
b = [x for x in b if x is not None]

答案 2 :(得分:3)

只需使用列表推导并将该条件添加到生成器表达式中:

>>> a=["a","b","c","d","e"]
>>> b=[1,2,None,3,4]

>>> [x for x in zip(a,b) if x[1] is not None]
[('a', 1), ('b', 2), ('d', 3), ('e', 4)]

>>> [x for x,m in zip(a,b) if m is not None]
['a', 'b', 'd', 'e']