2017-01-23 88 views
-4

我不認爲標題是一個很好的工作,可以作爲問題的高級解釋,但我確實認爲這是一個有趣的問題,試圖解決:Python - 構建三元組元組的三元組策略

鑑於長度爲2的元組的Python列表:

pairs = [('G', 'H'), ('C', 'D'), ('B', 'D'), ('A', 'B'), ('B', 'C')] 

我想創建包含長度爲3的元組的新列表,條件是元組(「X」,「Y」,「Z X」, 'Y'),( 'Y', 'Z'),和( 'X', 'Z')全部顯示爲在對列表中的元組 '僅當對(創建)'。在我的對列表中,只有三線態(「B」,「C」,「d」)將被創建(優選按字母順序)的情況下。

我沒有在幾個月使用蟒蛇,所以我有點生疏了,寧願要解決這個主要使用基地Python包,而是開放給任何建議。預先感謝任何幫助!

+0

這是一個不好的帖子? – Canovice

+2

您尚未發佈顯示您嘗試過的代碼。所以從技術上講,這不是一個好的職位。總之...你可以創建一組包含所有所有元組的元素(這可以確保每個元素只是有一次)。然後創建一個列表中的所有元素並對其進行排序。現在你有一個唯一元素的有序列表。然後,您可以遍歷您的有序列表,查找連續三個增量元素的序列,如果是,請將它們寫入輸出。繼續遍歷列表中的更多三個序列。您怎麼看這個可以解決 –

+1

在紙上記下 - 包括在您的文章這個過程,也許在編寫過程僞代碼的嘗試。 – wwii

回答

0
vals = set([i for (i, j) in pairs] + [j for (i, j) in pairs]) 

triples = [(i, j, k) for i in vals 
         for j in vals 
          for k in vals 
      if (((i, j) in pairs) and 
       ((j, k) in pairs) and 
       ((i, k) in pairs))] 

現在,這隻適用於元組的順序。如果不是,你想包含pairs的逆序元組以及

0

我想用itertools來檢查是否存在所有的對。

from itertools import combinations 

doubles = [('G', 'H'), ('C', 'D'), ('B', 'D'), ('A', 'B'), ('B', 'C')] 
keys = set([x for double in doubles for x in double]) 
options = combinations(keys, 3) 

triples = list() 
for option in options: 
    x, y, z = sorted(option) 
    first, second, third = (x, y), (x, z), (y, z) 
    if first in doubles and second in doubles and third in doubles: 
     triples.append(option) 

這假定列表中的所有元組都已經排序。