2017-02-18 1 views
0

次のように私がリストを持っている:Pythonとリスト要素のすべての組み合わせ、特定の順序で

((0,n1,n2,...,nX),(0,n1,n2,...,nY),(1,n1,n2,...,nZ),(2,n1,n2,...,nR),(2,n1,n2,...,nS)) 

私は、このような方法で、リスト要素のすべての可能な組み合わせを返すしたいと思います:

(0,n1,n2,...,nX),(1,n1,n2,...,nZ),(2,n1,n2,...,nR) 
(0,n1,n2,...,nY),(1,n1,n2,...,nZ),(2,n1,n2,...,nR) 
(0,n1,n2,...,nX),(1,n1,n2,...,nZ),(2,n1,n2,...,nS) 
(0,n1,n2,...,nY),(1,n1,n2,...,nZ),(2,n1,n2,...,nS) 

ので、私は、要素を繰り返し処理し、リスト要素の最初の要素をチェックして最初の要素で要素をグループ化する必要があることを理解し、解決しました。

私はおそらくforループをすることができますか?すべての組み合わせを手動で作成しようとしますか?

しかし、もっと良いアプローチがあるのでしょうか?

私は要素は要素の最初の項目で注文昇順でなければならないことを心に留めておく必要がある - > 0、1、2

EDIT:

これは、他の言葉で私のリストです:

(0,A),(1,C),(2,D) 
(0,B),(1,C),(2,D) 
(0,A),(1,C),(2,E) 
(0,B),(1,C),(2,E) 

を次のように返すためにどのように

((0,A), (0,B), (1,C), (2,D),(2,E)) 

+0

あなたが何を求めているかははっきりしません。あなたは3要素の組み合わせが欲しいですか?タプルは不変ですか?それで、 '(0、n1、n2、...、nX)'は常に同じままですか?それはただの要素ですか?それから、より簡単な形で、例えば 'A'と書いてください。 – Thanassis

+0

要素がリストであるリストがあります(サブリストと呼ばせてください)。各サブリストの最初の要素は一種のIDです。いくつかのサブリストは同じIDを有してもよく、そのうちのいくつかは特定のIDを有する唯一のサブリストであってもよい。あなたはID = 2のサブリストをいくつか持つことができます。 ID = 5のサブリストを1つだけ返します。同じIDを持つサブリストから1つのサブリストを選択して組み合わせに戻すような方法ですべての組み合わせを返すようにしたいのですが、次に選択したサブリストをスキップして、同じID範囲のサブリストから...それはそれをより明確にしますか? – user7583612

+0

チェック例が提供されました...返された組み合わせには一意の最初の項目を持つ単一の要素があることがわかります。要素の最初の項目として値0を持つ各組み合わせに2つの項目はありません。 – user7583612

答えて

1

データ構造を少し変更すると問題が簡単になります。具体的には、同じリスト内の同じ「ID」を持つすべての要素をグループ化するだけです。

ご例えば、あなたは3つのリストがあります:

a = [(0,n1,n2,...,nX),(0,n1,n2,...,nY)] 
b = [(1,n1,n2,...,nZ)] 
c = [(2,n1,n2,...,nR),(2,n1,n2,...,nS)] 

をあなたがトラブルのようにリストを分離している場合、私に教えてください、と私は私の答えを修正します。

次に、itertools.product関数を使用して、必要なすべての組み合わせを取得できます。

import itertools 
for i in itertools.product(a, b, c): 
    print i 

それとも、リストとしてすべての組み合わせを見たい場合は、単純に行うことができます:あなたはタプルとしてすべての組み合わせを見たい場合は

list(itertools.product(a, b, c)) 

同様に、あなたはtuple()set()を使用することができますまたはセット。

EDIT: あなたの要素がすでにグループ化されておらず、代わりにタプルのリスト(またはタプル)がフラット化されている場合は、タプルを「ID」に従ってグループ化するリストを作成できます単純なタプルの値)。これを行う関数があります。私はタプルが最初に与えられているかには順序(そうでない場合、我々は、おそらくこれは、より効率的にグループ化することができます)

def groupList(flatlist): 
    tempdict = {} 
    for element in flatlist: 
     id = element[0] 
     if id in tempdict: 
      tempdict[id].append(element) 
     else: 
      tempdict[id] = [element] 
    return list(tempdict.values()) 

今、あなたはすべての組み合わせを取得するには、この「グループ化」リストを使用することができますが存在しないと仮定します。そして、あなたが行うことができ、例えば、あなたの初期リストがLであると仮定しよう:

list(itertools.product(*groupList(l))) 

お知らせ*引数を渡します。これは、このリストの要素を関数の別の引数として使用するようにPythonに指示します。

例入力:

L =((0,10)、(0,20)、(1,30)、(2、40)、(2、50))

出力例:

[((0,10)、(1,30)、(2、40))、((0,10)、(1,30)、(2,50) )、((0,20)、 (1,30)、(2,40))、((0,20)、(1,30)、(2,50))]

+0

ねえ、助けてくれてありがとう。 itertoolsは大いに役立ちます。どのように多くのサブリストを取得するか分からないときに、リストをいくつかのリストに分割する方法はありますか? – user7583612

+0

私の答えを編集しました。私はこれがあなたの質問に完全に答えることを望みます。 – Thanassis

+0

これはほとんど仕事をしています...正しい順序でない要素を含むリストを返します。 id 1はインデックスされ、0はインデックスされます。id 2はインデックスされます。2.それは辞書が性質上ソートされていないためですか? – user7583612

関連する問題