10

次のリストsとビットマスクから始めbます。

s = ['baa', 'baa', 'black', 'sheep', 'have', 'you', 'any', 'wool']
b = [1, 0, 0, 0, 1, 1, 1, 0] # or any iterable with boolean values

apply_bitmask(s, b)返すように関数を書くにはどうすればよいですか

['baa', 'have', 'you', 'any']
4

4 に答える 4

19

Python 3.1 itertools.compress (または、まだアップグレードしていない場合はPython 2.7 ) はまさにそれを行います (リストの内包表記は本当にすぐ近くにあります):

import itertools
filtered = itertools.compress(s, b)

これは、リストではなく反復子を生成することに注意してください。メモリを節約しますが、何度か反復する必要がある場合やインデックスを使用する必要がある場合は、いつでも を使用できますlist(itertools.compress(s, b))。まだ短い。

于 2010-08-24T10:31:23.600 に答える
11
[ item for item, flag in zip( s, b ) if flag == 1 ]
于 2010-08-24T10:12:41.727 に答える
8

リスト内包表記を使用できます:

newList = [word for (word, mask) in zip(s,b) if mask]
# Note: Could also use 'if mask == blah', if mask is not a boolean-compatible type.

これは最初に元の 2 つのリストを取得し、それらをまとめてzipします。これにより、単語とそのマスクのペアの (一時的な - これはまだリスト comp の中にあります!) リストが得られます - のようなもの[('baa',1), ('baa',0),...]です。次に、マスク 1 ( ) を持つ単語のみif mask == 1が に追加されnewListます。

于 2010-08-24T10:14:35.077 に答える