我有两个相同大小的列表,例如:
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方法来实现这一点。
答案 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']