2014-02-12 68 views
0

所以我想運行被佈置成像這樣」與列表協調的比較裏面列出清單

def my_function(lista, listb): 
    .... 

lista = [ [ [x,y], [x,y], [x,y], [x,y] ] ] 

listb = [ [x,y], [x,y], [x,y], [x,y] ] 

listc = [] 

我一直coordinance之間的比較,在這種情況下,簡單地做這個調用我的函數:

index = [0,1,2,3,4,5,6,7,8,9] 

for i in index: 
    temp = my_function(lista[0][i], listb[i]) 
    listc.append(temp) 

但是我已經如此嚴重,我現在添加多個列表序列LISTA,並希望有列表呼籲數組listB每個序列點

像這樣:

for i in lista: 
    for q in listb: 
     for z in q: 
      my_function(i,z) 

但是我不確定這是否會起作用,即使這樣做會很慢。我想知道是否有人知道更清潔,更有效的方法來做到這一點?不要忘記,這是一個生成程序,任何和所有數據都是可變的。

謝謝,

+0

任何特別的原因你的'lista'包含了一個不必要的單元素列表 整件事? – user2357112

+0

你比較什麼意思? – thefourtheye

+0

你可以使用itertools的一些工具來做到這一點,但瓶頸可能在你的功能。矢量化該功能可能會更好。 – M4rtini

回答

0

您嘗試的方法會很慢。你可以肯定。但是,如果你的「my_function」使得itens變得複雜一些,那麼它將成爲一種方式 - 即對所有列表項目運行一個循環,並將另一個循環與另一個列表上的所有項目進行組合。這是強制性的O(m X n),並且隨着你擁有更多的物品,它將會變慢。

但是,如果您只是想檢查listb中的哪些項目在lista中並且在listc中具有這些項目,則有快速的方法。

最合適的方式是使用sets:Python中的一個無序容器,它可以檢查一個元素是否比其中包含的元素快得多,它比普通列表要快得多,這需要順序搜索。

但是,如果您只想比較兩個列表中的元素,那麼在闡述如何使用集合執行操作之前,瞭解Python中的列表和其他序列類型可以直接進行比較非常重要 - 無需特殊功能對它們進行比較,或通過項目的比較項目:

>>> [1, 1] == [1, 1] 
True 

即使對於列表 內的清單(或字典,元組,集合和列表內彼此)的深層結構中同樣如此:Python的 將遞歸地比較使用==運算符的複雜數據結構 中的所有元素。

現在,回到集: 最後的答案,您的問題可能只是: (這只是一次比較兩個名單 - 因爲你的 lista其內部具有幾個列表,您將需要一個額外的循環來 挑選每一類又同時創建集和交集 - 但它會爲每個座標 內lista列表只是一個循環 - 而不是在那裏每個項目的循環)

seta = set(tuple(item) for item in lista) 
setb = set(tuple(item) for item in listb) 
listc = list(setb.intersection(seta)) 
+0

該函數具有條件以及多個數學運算。我不知道這是否會奏效。 – user3222029

+0

該函數基本上是一個與lista和listb中的協調一起工作的公式,然後將解決方案發送給listc。 – user3222029

+0

在這種情況下,除了做O(m X n)的方式,你別無選擇。如果該函數被重寫爲使用list/st理解而不是3個明確的for循環,那麼複雜度就不會有任何增益。如果速度是一個問題,並且如果有重複的座標,您可以從記憶技術中受益,這很困難。如果座標是非量化空間中的浮點,則不是這樣。 – jsbueno