2016-10-17 3 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은 조합 수입니다.

[['A', 'B'], ['C'], ['D']] 
[['A', 'B'], ['D'], ['C']] 
[['A', 'C'], ['B'], ['D']] 
[['A', 'C'], ['D'], ['B']] 
[['A', 'D'], ['B'], ['C']] 
[['A', 'D'], ['C'], ['B']] 
... 

그러나 이러한 조합 배열을 만드는 방법을 모르겠습니다. 물론 파이썬에서 많은 조합이 유용하다는 것을 알고 있습니다. 그러나 조합 조합 배열을 만드는 방법을 사용하는 방법을 모르겠습니다.

EDITED

내 설명이 혼란 미안 해요. 간단한 예를 보여줍니다.

  • 패턴 0 [1, 1]
  • 패턴 1 :

  • chars = ['A', 'B'][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을 사용하고 있기 때문에 위의 단지 파이썬 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