2017-01-23 6 views
-4

タイトルは問題の高レベル説明として機能するとは思えませんが、これは解決しようとすると面白い問題だと思います:Python - ペアタプルからトリプレットタプルを構築する戦略

は、長さ2のタプルのPythonのリストを考える:

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

私はタプル(「X」、「Y」、「Zことを条件に、長さ3のタプルを含む新しいリストを作成したいです')は、ペア(' X '、' Y ')、(' Y '、' Z ')、および(' X '、' Z ')がすべてペアリストでタプルとして現れる場合にのみ作成されます。私のペアのリストの場合、トリプレット( 'B'、 'C​​'、 'D')のみが作成されます(アルファベット順が望ましい)。

私は数ヶ月でPythonを使用していないので、ちょっと錆びていて、基本的には基本的なPythonパッケージを使用して解決したいと思っています。助けをあらかじめありがとう!

+0

これは悪い投稿ですか? – Canovice

+2

あなたは試したことを示すコードを掲載していません。技術的には素晴らしい投稿ではありません。とにかく...すべてのタプルのすべての要素を含むセットを作成することができます(これは、各要素が1回だけ存在することを保証します)。次に、セット内のすべての要素のリストを作成し、ソートします。これで、固有の要素の順序付きリストが作成されました。次に、3つのインクリメンタル要素のシーケンスを連続して探し出す順序付きリストをトラバースすることができます。そうであれば、それらを出力に書き込みます。より多くの3つのシーケンスのリストをトラバースしてください。 –

+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) 

これは、リスト内のすべてのタプルが既にソートされていることを前提としています。

関連する問題