3

配列/タプル/リストに別の配列/タプル/リストの要素のみが含まれているかどうかを確認する最良の方法は何ですか?

私は次の2つのアプローチを試しましたが、さまざまな種類のコレクションに適していますか?このチェックには他にどのような(より良い)方法を使用できますか?

import numpy as np

input = np.array([0, 1, -1, 0, 1, 0, 0, 1])
bits = np.array([0, 1, -1])

# Using numpy
a=np.concatenate([np.where(input==bit)[0] for bit in bits])
if len(a)==len(input):
    print 'Valid input'

# Using sets
if not set(input)-set(bits):
    print 'Valid input'
4

3 に答える 3

5

すでに numpy 配列を使用しているため、in1d関数を使用できます。

>>> import numpy as np
>>> 
>>> input = np.array([0, 1, -1, 0, 1, 0, 0, 1])
>>> bits = np.array([0, 1, -1])
>>> 
>>> if np.in1d(input, bits).all():
...     print 'Valid input'
... 
Valid input
于 2012-05-09T18:02:45.797 に答える
4

入力# Using numpyリストの完全なコピーを作成するという点で、大規模なセットでは非常に非効率的です。

私はおそらくそうするでしょう:

if all(i in bits for i in input):
    print 'Valid input'

これは、あなたがやろうとしていることを書くための非常にlistpythonicな方法であり、大きな可能性がある全体(または)を作成しないという利点があり、最初に遭遇したときにset停止します(そして戻ります)にないFalseからの要素。inputbits

于 2012-05-09T17:58:46.527 に答える
2

一般に、set をこのように使用するだけで、演算子 - を使用して新しいセットを再計算するよりも高速になる可能性があります。

input = set([0, 1, -1, 0, 1, 0, 0, 1])
bits = set([0, 1, -1])

input.issubset(bits)

編集:

issubset はまさにこの問題のために書かれたメソッドです ( http://hg.python.org/releasing/2.7.3/file/7bb96963d067/Objects/setobject.cのソースを参照)。基本的には次のものと同等です。

def issubset(self, other):
    if len(self) > len(other):
        return False

    for i in self:
        if i not in other:
            return False

    return True
于 2012-05-09T18:07:32.877 に答える