2011-11-18 35 views
0

我是Python的新手,嘗試用不同的方法來優化和簡化我的代碼。在陣列列表中找到數組的存在的更好方法

我有一個數組列表(一定是這種格式)最初是空的,我需要用數組更新,確保沒有添加重複的條目。

現在我做下面的方式,這是我想出來的唯一的事情,其工作原理:

if len(where(((array(self.pop_next)-(self.pop[self.top_indv_indx[i]]))==0).sum(1)==len((self.pop[self.top_indv_indx[i]])))[0])<=0): 
    self.pop_next.append(self.pop[self.top_indv_indx[i]]) 

其中self.pop_next是我的數組列表,self.pop[self.top_indv_indx[i]]是要添加的陣列。

我知道這Unpythonic,並猜測有更好的簡單的方法來做同樣的事情。 請幫助

+1

什麼是'where'?你在用'numpy'數組嗎?如果你可以將代碼分解成幾行,那麼它會很好。 – pajton

+0

是的,我使用numpy數組。現在我隱式地試圖用where關鍵字來匹配數組。 – Sachiros

+1

如果你試圖擁有不同對象的容器,那麼你應該使用'set'和你自己的'__cmp__'操作?你的項目做什麼? – pajton

回答

0

您可能想試試numpy.all(array1 == array2)作爲單個數組比較的條件。

擴展在編輯:

要遍歷所有的列表,你可以使用以下命令:

if all((numpy.all(array_to_add != a) for a in array_list)): 
    array_list.append(array_to_add) 

與此相比array_to_add由價值array_list所有元素。請注意0​​這裏是__builtin__.all,與numpy.all相反。如果你以前做過from numpy import *,這將不起作用。改爲使用import numpy,並按上面的示例通過全名調用函數。

如果它是確定由對象進行比較(即,兩個陣列僅是相同的,如果所述的存儲器中的完全相同的對象),使用下面的簡單的變體:

if array_to_add is not in array_list: 
    array_list.append(array_to_add) 
+0

但我需要檢查數組中的數組的存在,我想你的代碼只是幫助我比較2個數組。 – Sachiros

+0

「在數組列表中存在數組」是指存在完全相同的數組對象,還是僅存在具有相同長度和值的數組?第一個很容易檢查,查看'list.index'方法,或者只是'列表中的對象'。 – silvado

+0

你的意思是嘗試除了循環索引檢查,但不會使我的代碼效率低於我目前的? – Sachiros

1

編輯:我從你的評論中看到你正在使用numpy數組。我從來沒有使用numpy,所以我不知道他們如何處理集合。

一個選項是使用setSets are like lists但他們是無序的,只允許添加一次,每個項目:

>>> s = set() 
>>> s.add(1) 
>>> s.add(2) 
>>> s.add(2) 
>>> s.add(2) 
>>> s 
set([1, 2]) 

但是,如果你嘗試將list添加到一組你會碰到的問題:

>>> s.add(['my','list']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 

的項目must be hashable添加到set,並且list不可散列,因爲它可以隨時通過添加或刪除值進行修改,因爲它不能具有不變的散列值。

如果你不需要你正在檢查是可變的,你可以將它們轉換成其是固定的,所以可哈希等設置友好的元組的列表:

>>> mylist = ['my','list'] 
>>> s = set() 
>>> s.add(tuple(mylist)) 
>>> s.add(tuple(mylist)) 
>>> s 
set([('my', 'list')]) 
+0

感謝Dave.I明白這很簡單,但它也需要我將元組集合轉換回數組列表形式,因爲我需要這種形式在並行計算器上運行它。 – Sachiros

+0

根據你有多少個數組和多長時間,使用'set'的性能優勢可能會超過將數組轉換爲元組的成本。您可能需要使用'timeit'和/或'time'模塊來執行一些計時器測試。 [timeit](http://docs.python.org/library/timeit.html); [時間](http://docs.python.org/library/time.html) – mdscruggs

相關問題