2016-07-18 13 views
3

ランダムに生成されたリストNew_Xをサイズ10で連続的に作成しています。これは500列に基づいています。リストのリストを効率的に調べる方法は?

私は新しいリストを作成するたびに、それがすでに作成し、私の質問があるList_Of_Xs

def NewList(Old_List): 

end = True 
while end == True: 

    """ Here is code that generates my new sorted list, it is a combination of elements 
     from Old_List and the other remaining columns, 
     but the details aren't necessary for this question. """ 

    end = (List_Of_Xs == np.array([New_X])).all(axis=1).any() 

List_Of_Xs.append(New_X) 
return New_X 

に追加されていないと、それは一意である必要があり、そして私の機能NewListだけNew_Xを返しますが、ありますend = (List_Of_Xs == np.array([New_X])).all(axis=1).any()効率的な方法を探してList_Of_Xs

私のList_Of_Xsは、100,000を超えるリストのサイズに成長する可能性があるので、これが非効率的であるかどうかはわかりません。

助けていただけたら幸いです!

+0

したがって、リストごとに10個の要素を持つリストのリスト[List_Of_Xs]はありますか?これらの要素は整数ですか?それらのintに上限と下限がありますか? – Divakar

+0

私は 'New_X'をタプルにして、それが' Set_of_Xs'のセットに入っているかどうかを調べます。特に、この配列の比較を行うよりも速いはずの10要​​素の小さなリストを使用します。 – hpaulj

+0

'List_of_Xs == np.array([New_X])'は 'New_X'を配列にするだけでなく、毎回' List_of_Xs'に対して配列を作成します。リストのリストから配列を作成することは時間がかからない作業です。 – hpaulj

答えて

1

コメントで見たように、特にリストが大きくなると、配列の比較が非常に遅くなる可能性があります。毎回配列を作成しなければならず、時間がかかります。

def foo(N=10): 
    return np.random.randint(0,10,N).tolist() 

機能リストを生成し、ユニークなもの

def foo1(m=10): 
    Set_of_Xs = set() 
    while len(Set_of_Xs)<m: 
     NewX = foo(10) 
     tx = tuple(NewX) 
     if not tx in Set_of_Xs: 
      print(NewX) 
      Set_of_Xs.add(tx) 
    return Set_of_Xs 

にサンプル実行を印刷するには:ここでは

は10要素のリストを作成するために、設定された実装

機能です。書かれているように、重複がある場合は表示されません。

In [214]: foo1(5) 
[9, 4, 3, 0, 9, 4, 9, 5, 6, 3] 
[1, 8, 0, 3, 0, 0, 4, 0, 0, 5] 
[6, 7, 2, 0, 6, 9, 0, 7, 0, 8] 
[9, 5, 6, 3, 3, 5, 6, 9, 6, 9] 
[9, 2, 6, 0, 2, 7, 2, 0, 0, 4] 
Out[214]: 
{(1, 8, 0, 3, 0, 0, 4, 0, 0, 5), 
(6, 7, 2, 0, 6, 9, 0, 7, 0, 8), 
(9, 2, 6, 0, 2, 7, 2, 0, 0, 4), 
(9, 4, 3, 0, 9, 4, 9, 5, 6, 3), 
(9, 5, 6, 3, 3, 5, 6, 9, 6, 9)} 
+0

ありがとう、これは私の 'Set_of_Xs'がかなり大きくなるにつれてより速くなった。私の関数 'NewX'がそれらをタプル形式で作成した方が簡単だろうと思いますか? –

+1

リストをタプル(またはバック)に変換することは大きな問題ではありません。 'set'は' tuple'を必要とするだけです(不変なので)。 – hpaulj

1

ので、コードが完全に表示されませんので、私はまっすぐに、これを取得してみましょう: 1.あなたは常にあなたがそれぞれに対してそれを比較リスト 3を計算し、各反復 2で成長している古いリストを持っていますあなたはループを壊す必要があるかどうかを確認するために古いリストのリスト?

リストのリストの代わりにリストにリストを格納することもできます。 要素をリストのすべての要素と比較することは、各繰り返しのO(n)操作になります。セットを使用すると、O(1)avg ...となるはずですが、最後までO(n)回繰り返されているかもしれませんが。

他の考えは、各要素のmd5を計算し、それらを比較して、完全なリストを比較しないことです。

+0

古いリストは各繰り返しで絶えず成長していません。古いリストはそれぞれList_Of_Xsに格納され、新しいリストはList_Of_Xと比較され、新しいリストがList_Of_Xsにない場合、ループは壊れます。 –

関連する問題