リストとビットマスクが与えられた場合、真のインデックスの値を返すにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3555375

質問

次のリストから始めます 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']
役に立ちましたか?

解決

Python 3.1 itertools.compress (また Python 2.7の まだアップグレードしていない場合)正確にそれを行います(リスト理解は本当に近い秒です):

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

これにより、リストではなくイテレーターが生成されることに注意してください。メモリを保存しますが、数回反復したり、インデックスを使用する必要がある場合は、いつでも使用できます list(itertools.compress(s, b)). 。まだ短い。

他のヒント

[ item for item, flag in zip( s, b ) if flag == 1 ]

使用できます 包括的リストをリストします:

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つのリストを取ります zips それらを一緒にして、あなたが(一時的な - これはまだリストコンプの内側にあります!)単語のペアとそのマスクのリストを取得します - [('baa',1), ('baa',0),...]. 。次に、1のマスクを持っている単語のみ(if mask == 1)に追加されます newList.

zipを使用して、リストの理解をもう1つ見ていきます

newList = [item for i, item in enumerate(s) if b[i]]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top