brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Jul 17. 2019

Python: itertools; 순열과 조합

재미는 없지만. 도움은 되는. 어떻하지.

파이썬에는 아직도 내가 모르는 많은 함수들이 존재한다.

아마도 평생 다 사용해 볼 수 없을 가능성이 거즘 99% 아닐까.

계속 생겨날 것이고,

지금 이렇게 글을 쓰는 와중에도 핸썸하고 스마트한 누군가가

열심히 Python 생태계를 위해서 만들고 있기 때문에.


그 중 하나를 공유하려고 한다.

itertools에 있는 순열 & 조합 기능이다.


예를 들어,

1. N개의 도시를 각각 한번씩만 돌아다니려고 한다.

2. 모든 도시는 연결되어 있다.

3. 각 도시를 이동 할 때에는 비행기를 타는데 돈이 필요하다.

4. 모든 도시를 다 둘러보고 처음 출발한 도시로 돌아와야 한다.

5. 가장 적은 돈으로 완수 할 수 있는 경로를 계획해야 한다.


꼭 예로 나타난 '도시'가 아니여도,

우리가 업무상 코드를 작성 할 경우에도

이런 경우가 발생 할 수 있다.


여기서는,

전체 경로를 우선적으로 나타낼 수 있는 간단한 파이썬 함수를 보여주려고 한다.


단순하게 N을 3 이라고 가정하고,

모든 경우의 수를 나열한다면?


그냥 노가다(?)로,

1. A, B, C

2. A, C, B

3. B, A,  C

4. B, C, A

5. C, A, B

6. C, B, A


3*2*1의 경우의 수를 보여준다.


이걸!

파이썬의 itertools 함수를 활용하면,



Permutation = '순열', '치환' 이라는 뜻을 가진다.


위에서 언급한 3*2*1이 순열을 구하는 방법이다.


사실,

이거 알면 위에 나온 조건값을 통해서 원하는 답을 금방 찾을 수 있다.


언제나,

고민하는 부분은 이렇다.

이렇게 잘 만들어진 함수를 사용할 것인지 or 직접 구현을 할 것인지.


나는 전자를 택한다. 지금까지 그래왔다.


실예로,

C를 매우 잘 짜는 사람이 있었다.

 Python의 Numpy는 transpose 라는 함수가 존재한다.

C를 매우 잘 짜는 사람이 transpose를 직접 구현하였다.

무엇이 더 좋은 성능을 가져다 주었을까?


답은,

나의 선택에 힘을 실어주었다.

100배 정도의 속도 차이가 존재했다.


왜 이런일이...

그건 각자 생각하도록 하자.


이번엔 조합.

3개의 구슬 중에서 2개를 선택한다.

각 구슬은 1, 2, 3 번호를 달고 있다.


총 경우의 수는 3C2 == 3*2/2! == 3 이다.


이걸!

파이썬의 itertools 함수를 활용하면,



'생산성' 이라는 말이 여기서 나올 수 있다는 생각이 들었다.


이 외에도 다양한 함수들이 존재한다.



Ref: https://docs.python.org/3.7/library/itertools.html



30분 정도에 Jupyter를 통해서 전체를 확인해 볼 수 있었다.


이제 시작하는 사람(나를 포함해서)

이라는 마음가짐으로 위 문서를 공부하면

분명히 지루한 코딩 작업에 작은 도움이 될 것이라고 생각한다.


끝.

작가의 이전글 Python: Spark와 GraphDB(1)
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari