2016-12-31 3 views
-2

위치 할당 제약 조건을 적용하면서 목록의 모든 순열을 얻으려고 필사적으로 노력하고 있습니다. 나는 [1,2,3,4,5,6]의 목록을 가지고있다. (6은 단지 예일 뿐이다. 나는 모든 길이와 함께 일할 수있는 무언가를 찾고 싶다.) 그리고 모든 길이 3의 목록을 찾고 싶다. 다음과 같은 제약 조건의 예)제약 조건이있는 목록의 순열

  • 위치 번호 1, 2
  • 2 위치 번호 1, 2 및 3
  • 위치 (3)에 의해 점유 될 수 의해 점유 될 수는 숫자에 의해 점유 될 수있다 (1) 2,3 및 4
  • 동일한 번호의 반복은 허용되지 않습니다.

이렇게하면 다음 목록을 얻을 수 있습니다. [1,2,3], [1,2,4], [1,3,2], [1,3,4], [2,1,3], [ 2,3,4], [2,1,4]

For those interested, what I am trying to implement is what is explained pages 5 and 6 of this paper

+0

그래서 (* itertools.product ([1, 2], [1, 2, 3], [2, 3, 4])) 작은 고유 번호 필터링? –

+0

이것에 대한 가상 코드는 8 페이지의 해당 PDF에 나타납니다. 그렇습니까? –

+0

실제로 8 페이지에서 첫 번째 노드와 마지막 노드를 연결하는 최단 경로를 찾는 것을 목표로하는 또 다른 코드입니다. 나는 수동으로 Cartesian 제품을 생성하려고 시도했다가 원하지 않는 요소를 제거하려고 시도했지만 끝이 없었다. – Jkev

답변

2

필터 하위 항목의 product() :

from itertools import product 

for combo in product([1, 2], [1, 2, 3], [2, 3, 4]): 
    if len(set(combo)) == 3: 
     print(combo) 

또는 지능형리스트로서 :

[combo for combo in product([1, 2], [1, 2, 3], [2, 3, 4]) if len(set(combo)) == 3] 

출력 :

>>> from itertools import product 
>>> [combo for combo in product([1, 2], [1, 2, 3], [2, 3, 4]) if len(set(combo)) == 3] 
[(1, 2, 3), (1, 2, 4), (1, 3, 2), (1, 3, 4), (2, 1, 3), (2, 1, 4), (2, 3, 4)]