2016-08-05 74 views
0

好的,不知道這是否是最好的標題,但我有兩個python列表。 L1和L2都具有類型T的元素並且不具有相同的長度。對於兩個列表l1和l2,如何檢查所有e1∈l1,?p(e1,e2),其中e2是l2中的某個元素,在python中有效?

我有一個函數p(T,T),這是一個謂詞檢查關於類型T的兩個元素

我想檢查在L1所有元件E屬性,對(E,E ')成立,其中e'是L2中的一些元素。所以基本上,對於L1中的每個元素,我會遍歷第二個列表,並檢查謂詞是否適用於任何元素。但我也想檢查另一個列表的相同的東西。

p(T,T)是對稱的。所以如果p(e,e')那麼p(e',e)。由於這種對稱性,我不想兩次做同樣的事情。我需要以某種方式記錄,如果我看到p(e,e'),那麼我知道p(e',e),而不必再次檢查第二個列表。

什麼是在Python中做到這一點的最佳方法?我想每個列表中的每個元素e1有另一個字段,告訴我們p(e1,e2)是否成立,其中e2是另一個列表的成員。但我認爲這需要複製這兩個列表,所以我不會改變它們。有沒有什麼好方法可以做到這一點?

+0

如果您願意按照您的建議做一些預計算,您可以隨時爲L1的每個元素執行O(1)次檢查。只需創建另外兩個列表LL1和LL2,這樣LL1 [i] == 1當且僅當LL1的第i個元素e1在L2中存在e1,使得p(e1,e2)。你可以記錄整個問題的答案(對於L1中存在的所有e1 ...) – Alejandro

+0

好的,我使用該代碼編輯了我的問題。我不確定這是否正是你的意思,但如果是這樣,那麼它對我來說就很有意義。 – Lana

+0

@Alejandro:那真的不能*保存*任何工作;預計算是'O(n ** 2)',它不是很可重用。 – user2357112

回答

2

p是對稱的事實本質上是無用的。確實如果你知道p(e, e')成立,你知道p(e', e)成立,但除非ee'都在這兩個列表中,否則你只能使用一次謂詞而不是兩次。即使列表可能存在大量重疊,重複評估仍然可能比嘗試利用對稱更有效。

執行所需檢查的最佳方式可能涉及重新組織數據並利用e的某些進一步結構來找到更高效的算法,但根據我們的信息,我們無法幫助您接着就,隨即。我建議最好是蠻力:

def check(p, l1, l2): 
    for a in l1: 
     if not any(p(a, b) for b in l2): 
      return False 
    return True 
+0

如何在所有(任何(p(a,b)爲b在l2中) –

+0

@tobias_k:是的,那可行。 – user2357112

0

我只想創造一個字典爲每個列表(可能是dict1dict2),而當你通過第一單迭代,同時設置了dict1[e] = e'dict2[e'] = e。然後,在迭代L2時,您只需首先檢查當前的e不在dict2中。如果存在重複的e值,也可以將此檢查添加到L1中的第一次迭代中。希望這是有道理的 - 在我的手機上寫這個。

+0

「你同時設置了'dict1 [e] = e''和'dict2 [e'] = e'」 - 但是你不知道'e''必須通過看'e'還是副作用反之亦然。如果你這樣做,會有更有效的方法來做到這一點。 – user2357112

+0

我以爲OP只是問一次他/她發現電子時如何避免再檢查' – Camsbury

+0

而且由於它是對稱的,e「是e – Camsbury

相關問題