2017-01-23 232 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) 

这假定列表中的所有元组都已经排序。