python筛选和列出并将“筛选索引”应用于另一个lis

2024-06-11 17:54:20 发布

您现在位置:Python中文网/ 问答频道 /正文

Possible Duplicate:
Python: Elegant and efficient ways to mask a list

我有两个同样大小的列表,比如:

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

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

我知道:

过滤器(bool,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] 仍然有无元素。

我很感激任何Python式的方法来达到这个目的。


Tags: andtonone元素列表masklistbool
3条回答
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]

这可以通过^{}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()应该很快)。

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

>>> 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']

相关问题 更多 >