2016-10-17 28 views
2

私はこれらの配列を持ち、それぞれのパターンは組み合わせのサイズを表す各数字を持つ組み合わせの形を指定します。配列と組み合わせパターンの組み合わせを見つける

  • パターン0:[1, 1, 1, 1]
  • パターン1:[2, 1, 1]
  • パターン2:[3, 1]
  • パターン3:[4]
  • ...

Iはまた、チャー値を有します以下のようなリスト。 len(chars)は、上位配列の値の合計と等しくなります。

chars = ['A', 'B', 'C', 'D']

私は与えられたパターン以下の文字のすべての組み合わせを見つけたいです。たとえば、パターン1の場合、4C2 * 2C1 * 1C1は組み合わせの数です。

しかし、このような組み合わせ配列の作成方法はわかりません。もちろん、私はPythonの組み合わせには多くの便利な関数があることを知っています。しかし、それらを組み合わせて組み合わせの組み合わせを作る方法を知りません。

EDITED

私は私の説明が混乱してごめんなさい。私は簡単な例を示します。

  • パターン0:[1, 1]
  • パターン1:

  • chars = ['A', 'B'][2]そして、結果は以下のようでなければなりません。したがって、最初の次元は順列でなければならないが、2番目の次元は組み合わせでなければならない。

    • pat0:[['A'], ['B']]
    • pat0:[['B'], ['A']]
    • PAT1:[['A', 'B']] # NOTE: [['B', 'A']] is same in my problem
  • 答えて

    1

    あなたはパターンの最初の番号を取得し、残りの項目からその長さのすべての組み合わせを生成する再帰関数を使用することができ。その後、残りのパターン&と、生成された接頭辞を使用して繰り返します。あなたは、パターン内のすべての数字だけyieldプレフィックス発信者にすべての方法を消費した後:

    from itertools import combinations 
    
    pattern = [2, 1, 1] 
    chars = ['A', 'B', 'C', 'D'] 
    
    def patterns(shape, items, prefix=None): 
        if not shape: 
         yield prefix 
         return 
    
        prefix = prefix or [] 
        for comb in combinations(items, shape[0]): 
         child_items = items[:] 
         for char in comb: 
          child_items.remove(char) 
         yield from patterns(shape[1:], child_items, prefix + [comb]) 
    
    for pat in patterns(pattern, chars): 
        print(pat) 
    

    出力:それはyield fromを使用していますので、上記のPython 3でのみ動作し

    [('A', 'B'), ('C',), ('D',)] 
    [('A', 'B'), ('D',), ('C',)] 
    [('A', 'C'), ('B',), ('D',)] 
    [('A', 'C'), ('D',), ('B',)] 
    [('A', 'D'), ('B',), ('C',)] 
    [('A', 'D'), ('C',), ('B',)] 
    [('B', 'C'), ('A',), ('D',)] 
    [('B', 'C'), ('D',), ('A',)] 
    [('B', 'D'), ('A',), ('C',)] 
    [('B', 'D'), ('C',), ('A',)] 
    [('C', 'D'), ('A',), ('B',)] 
    [('C', 'D'), ('B',), ('A',)] 
    

    注意を。

    +0

    これは私がやりたいことです!ありがとうございました。 – jef