2016-11-08 23 views
0

列表的元素的假設我有列表occurence在列表

record = [['g1','g2','g3'],['g2','g4'],['g1','g3','g5'],['g2','g3','g5'],['g1','g4']] 

的名單,我有元組

list1 = [('g1','g2'),('g1','g3'),('g1','g4'),('g1','g5'),('g2','g3'),('g2','g4'),('g2','g5'),('g3','g4'),('g3','g5'),('g4','g5')] 

的列表現在多少次('g1','g2')發生在記錄? 解決方案應該是1,因爲('g1','g2')僅存在於['g1','g2','g3']

我可以將元組列表更改爲列表列表。有沒有簡單的方法而不是蠻橫的手段?因爲我列出的清單可能包括1000K項目

+0

你不感興趣這一個:http://stackoverflow.com/questions/3847386/testing-if-a-list-contains-another-list-with-python? – pt12lol

+0

你有試過什麼嗎?即使是蠻力? –

+1

確定順序嗎? – Julien

回答

1

這不是很漂亮,但它的工作原理:

record = [['g1','g2','g3'],['g2','g4'],['g1','g3','g5'],['g2','g3','g5'],['g1','g4']] 
pattern = [('g1','g2'),('g1','g3'),('g1','g4'),('g1','g5'),('g2','g3'),('g2','g4'),('g2','g5'),('g3','g4'),('g3','g5'),('g4','g5')] 

res = {} 
for p in pattern: 
    res[str(p)] = 0 
    for r in record: 
     if set(p).issubset(set(r)): 
      res[str(p)] += 1 

print(res) 

編輯:
10^6項目? (好吧,這是不會工作,然後...)

0

考慮列表中的項目,g1, g2, ...作爲無向圖的頂點。瀏覽你的清單並建立圖表。每次g1g2發生在同一個子列表中,將g1 <-> g2的權重增加1。然後,您要查找的數字是元組元素上的邊的權重。

這假定元組將總是有兩個元素。如果元組的大小是任意的,除了子列表是任意的,那麼這個問題簡化爲找到多個子圖同構,每個子圖都是NP-Complete。看到這個:https://stackoverflow.com/a/5279581/1749870

+0

你能否解釋第二段。我不清楚 –

+0

我的意思是,只有當你的元組長度爲2時,這種方法纔是實用的。這將允許你直接檢查邊緣權重。對於更大的元組,您將必須檢查由元素形成的整個子圖是否存在於更大的圖中。在你的例子中,如果'list1'中的一個元組是'(g1,g2,g3,g5)',那麼你將不得不檢查由這4個節點構成的完整子圖是否存在於由record創建的圖中,如果是這樣,找到最小的邊重量。但是發現圖G是否是另一個圖T的子圖是上面提到的NP完全問題。 – TheDarkKnight