2017-04-06 6 views
0

これはやり方に関する質問ではなく、より効率的なやり方に関する質問です。私は2つのリストを持っています。これは、subListのすべての要素といくつかの要素を含むsuperListです。例えば、以下のリストを取ることができます:リストの位置をPythonの別のリストの中で確認する最も効率的な方法

a = [0,1,2,3,4,5,6,7,8,9] # a is my superList 
b = [2,3,5,7] # b is my subList 

私はのためのリストを得た方法で、中で存在するBの要素をチェックして、同様にお答えしたい:

[0, 0, 1, 1, 0, 1, 0, 1, 0, 0] 

私はこのコードを持っていますここでは短いリストと少量のobサブリストでうまくいくが、データサイズが増え始めると効率が悪くなる。どのソリューションが以下のソリューションよりも効率的でしょうか。 longListの中でshortListを大量にチェックするためにこのコードを実行したいと思います。これは、状況のためにネストしたものです。

def isInList(longList, shortList): 
    indexList = [] 
    for i in range(len(longList)): 
     if longList[i] in shortList: 
      indexList.append(1) 
     else: 
      indexList.append(0) 
    return indexList 
+0

O(nm)のnはのサイズであり、mはBのサイズでパフォーマンスがあります。ショートリストを 'set'にすると、O(n)の解を得ることができます。 –

+0

構文的には、longListで' for i:shortList: 'iの場合はshortList:'などです。 – ryugie

+0

リスト内包はどうですか? –

答えて

4

リストの理解はPythonで非常に効率的です。 O(n)の中でチェックする簡単な方法は、実行することです。

[1*(aa in b) for aa in a] 
# returns: 
[0, 0, 1, 1, 0, 1, 0, 1, 0, 0] 

さらに効率的なセットで存在をチェックすると、O(1)であるとして、セットにbを変換することです。あなたが行くことができます

b_set = set(b) 
[1*(aa in b_set) for aa in a] 
# return: 
[0, 0, 1, 1, 0, 1, 0, 1, 0, 0] 
+1

1で乗算が何をしているのかわからない場合は、boolをintにキャストしています。さらにテストする際に 'int(aa in b)'(OPの場合) – acushner

+1

を実行すると、 'int'を呼び出すことは乗算より遅くなります – James

0

もう一つの方法は次のとおりです。

[1 if _ in b else 0 for _ in a] 
関連する問題