수학에서 집합의 모든 구성원을 어떤 순서나 순서로 배열하고 집합이 이미 순서가 지정된 경우 해당 요소를 재배열(재정렬)하는 것을 순열이라고 합니다. 다른 기술을 사용하여 순열을 생성할 수 있습니다. 다음은 그 중 일부입니다.
방법 1
Python에는 itertools라는 순열 및 조합을 위한 전용 모듈이 함께 제공됩니다.
먼저 모듈 가져오기
>>> import itertools >>>
순열 함수를 사용하면 순서가 중요한 목록 내에서 N 값의 순열을 얻을 수 있습니다. 예를 들어, [1,2,3,4]를 사용하여 N =2개의 값을 선택하면 다음과 같이 수행됩니다. -
Permutation (order matters): >>> print(list(itertools.permutations([1,2,3,4],2))) [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
조합(순서는 상관없음)
>>> print(list(itertools.combinations('1234', 2))) [('1', '2'), ('1', '3'), ('1', '4'), ('2', '3'), ('2', '4'), ('3', '4')]
방법 2
아래는 새로운 중간 목록을 생성하지 않고 목록에 구현한 것입니다.
def permute(xs, low=0): if low + 1 >= len(xs): yield xs else: for p in permute(xs, low + 1): yield p for i in range(low + 1, len(xs)): xs[low], xs[i] = xs[i], xs[low] for p in permute(xs, low + 1): yield p xs[low], xs[i] = xs[i], xs[low] for p in permute([1, 2, 3]): print (p)
출력
[1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 2, 1] [3, 1, 2]
재귀를 사용하는 방법 3
import copy def perm(prefix,rest): for e in rest: new_rest=copy.copy(rest) new_prefix=copy.copy(prefix) new_prefix.append(e) new_rest.remove(e) if len(new_rest) == 0: print (new_prefix + new_rest) continue perm(new_prefix,new_rest) perm([],[1, 2, 3])
출력
[1, 2, 3] [1, 3, 2] [2, 1, 3] [2, 3, 1] [3, 1, 2] [3, 2, 1]