6

重複の可能性:
Python: リストをマスクするエレガントで効率的な方法

次のような 2 つの同じサイズのリストがあります。

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]

この方法は、セレクターを 1 回だけ生成することを意味します (そして、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 に答える