6

可能重复:
Python:优雅而有效的方式来屏蔽列表

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

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

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

我知道:

过滤器(布尔,b)

这将从 [b] 中删除 None 元素,但是,我该如何删除 list[a] 中的相应条目?

我尝试了 zip,类似于(我的想法是打包和解包):

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

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

我将不胜感激任何pythonic方式来实现这一点。

4

3 回答 3

8

这可以通过itertools.compress()列表理解巧妙地完成:

>>> 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()应该很好而且很快)。

于 2012-11-15T12:25:21.910 回答
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]
于 2012-11-15T12:23:06.097 回答
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']
于 2012-11-15T12:18:57.743 回答