2016-07-18 19 views
3

我不斷創建一個隨機生成的列表,大小爲10的New_X,基於500列。查看列表列表的有效方法?

每次我創建一個新的列表,它必須是唯一的,我的功能NewList只返回New_X一旦它尚未被創建並附加到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 

我的問題是,是行end = (List_Of_Xs == np.array([New_X])).all(axis=1).any()尋找List_Of_Xs有效的方法?

我的List_Of_Xs可以增長到超過100,000個列表的長度,所以我不確定這是否是低效的。

任何幫助,將不勝感激!

+0

那麼,List_Of_Xs是每個列表有10個元素的列表列表嗎?這些元素是整數嗎?這些整數有上限和下限嗎? – Divakar

+0

我會使'New_X'成爲一個元組,並檢查它是否在Set_of_Xs中。特別是對於10個元素的小列表,應該比進行這種數組比較更快。 – hpaulj

+0

'List_of_Xs == np.array([New_X])'不僅使'New_X'成爲一個數組,而且它每次都爲'List_of_Xs'這樣做。從列表中創建數組並不是一項時間細小的任務。 – hpaulj

回答

1

正如我在評論中所看到的那樣,數組比較可能非常慢,特別是當列表變大時。它必須每次創建數組,這會消耗時間。

這裏有一組實施

函數來創建10元素的列表:

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 

採樣運行。正如所寫,它不顯示是否有重複。

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.你是不斷在每次迭代 2.計算列表生長舊列表 3.您對每個進行比較舊列表中的列表以查看是否應該打破循環?

一種選擇是將列表存儲在一個集合中而不是列表列表中。 比較元素和列表中的所有元素在每次迭代中都是O(n)操作。使用一個集合,它應該是O(1)avg ...雖然你可能每次迭代都會得到O(n),直到最後一個。

其他的想法是計算每個元素的md5並比較這些元素,以便您不比較完整列表。

+0

舊列表在每次迭代中都不會不斷增長。每個舊列表都存儲在List_Of_Xs中,並且每個新列表都與List_Of_Xs進行比較,如果新列表尚未在List_Of_Xs中,則循環被破壞。 –