2016-07-26 4 views
1

의 내가 행동의 세 가지 유형의 포함 할 수있는 작업 목록,이 가정 해 봅시다 :논리식에 따라 중첩 된 목록의 모든 조합을 계산

유형 A : 행동 (분리)의 모든 유형을 포함 할 수 있습니다
타입 B를 : 모든 유형의 작업을 포함 할 수 있습니다 ( 주문)
유형 C : 하위 작업을 포함 할 수 없습니다. 이것은 내가 끝까지 갖고 싶어하는 수준입니다.

나는 (disbunction과 연결이 튜플과리스트로 각각 표현 될 수 있다고 생각했다. (python - representing boolean expressions with lists 기준) 그러나 이것이 최적의 솔루션인지는 확실하지 않다.

유형 A와 B에는 유형 요소를 포함하는 dict가 있습니다.

type_a = { 
‘a1’: ('b1', 'a2'), 
‘a2’: ('c1', 'c2') 
} 

type_b = { 
‘b1’: ['c4', 'c5', 'c7'], 
‘b2’:['c3', 'c4'] 
} 

상세한 설명 :(['c4', 'c5','c7'], 'c1', 'c2')

'A2'과 동등한 ('b1', 'a2') 같다

'A1'은 ('c1', 'c2')

'B1'과 동일 같다 ['c4', 'c5', 'c7']

'b2'가 동일 함 예 입력

['c3', 'c4'] 행 :

['a1', 'b2', 'c6'] 

예상 출력 :

결과는 오직 C 형 작업을 포함한다.

원시

[(['c4', 'c5', 'c7'], 'c1', 'c2'), 'c3', 'c4', 'c6'] 

모든 조합

['c4', 'c5','c7', 'c3', 'c4', 'c6'] 

['c1', 'c3', 'c4', 'c6'] 

['c2', 'c3', 'c4', 'c6'] 

질문 :

  • 가 결합 및 분리 재와 생각이 튜플을 표현하고 좋은 아이디어를 나열 하는가?
  • 이것을 구현하는 효율적인 방법은 무엇입니까?
  • itertools를 사용하여 모든 조합을 계산하는 함수를 구현할 수 있습니까? (저는 그들에게 에 대해 익숙하지 않지만 매우 강력하다고 들었습니다.)

어떤 도움을 주셔서 감사합니다.

답변

1

슬프게도 itertools는별로 도움이되지 않습니다. 다음 재귀 짐승 그러나 일을 할 것 같다 :

def combinations(actions): 
    if len(actions)==1: 
     action= actions[0] 
     try: 
      actions= type_a[action] 
     except KeyError: 
      try: 
       actions= type_b[action] 
      except KeyError: 
       #action is of type C, the only possible combination is itself 
       yield actions 
      else: 
       #action is of type B (conjunction), combine all the actions 
       for combination in combinations(actions): 
        yield combination 
     else: 
      #action is of type A (disjunction), generate combinations for each action 
      for action in actions: 
       for combination in combinations([action]): 
        yield combination 
    else: 
     #generate combinations for the first action in the list 
     #and combine them with the combinations for the rest of the list 
     action= actions[0] 
     for combination in combinations(actions[1:]): 
      for combo in combinations([action]): 
       yield combo + combination 
아이디어는 첫 번째 작업 ( 'a1')에 대한 모든 가능한 값을 생성하고 (재귀 적으로 생성 된) 나머지 작업 조합 ( ['b2', 'c6'])와 조합하는 것입니다

.

이렇게하면 목록 및 튜플과 연결 및 분리를 나타낼 필요가 없어지며 솔직히 혼란 스럽습니다.

+0

우수합니다. 감사합니다. 확장으로 나는 언급 된 문자열을 첫 번째 요소로 포함하는 list 요소도 받아 들일 것으로 생각했습니다.'[[ 'a1', { 'param': 'something'}], [ 'b2', { 'param': 'something'}]'. 두 번째 요소 (dict)는 전달되어야합니다. – eljobso

0

주문 작업을 염두에 두지 않는 경우에도 집합 작업을 지원하는 Python의 set type이 있습니다.