본문 바로가기
PROGRAMMING/PYTHON

[Python] 파이썬을 파이썬답게 - itertools 모듈

by 안녕나는현서 2022. 1. 15.
728x90

https://programmers.co.kr/learn/courses/4008

 

파이썬을 파이썬답게

본 강의는 파이썬 문법을 이미 알고 있는 분들을 대상으로 만들어졌습니다. ##### 이런 분들께 추천합니다 * 파이썬 문법을 알고 계시는 분 * 알고리즘 문제를 조금 더 쉽게 풀고 싶은 분 * Python 코

programmers.co.kr

 

itertools

[곱집합 구하기]

  • 두 스트링 'ABCD', 'xy' 의 곱집합은 Ax Ay Bx By Cx Cy Dx Dy 
iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'

for value1 in iterable1:
    for value2 in iterable2:
        for value3 in iterable3:
            print(value1, value2, value3)
            
# itertools.product 사용
import itertools

iterable1 = 'ABCD'
iterable2 = 'xy'
iterable3 = '1234'
print(list(itertools.product(iterable1, iterable2, iterable3)))

# [('A', 'x', '1'), ('A', 'x', '2'), ('A', 'x', '3'), ('A', 'x', '4'), ('A', 'y', '1'), ('A', 'y', '2'), ('A', 'y', '3'), ('A', 'y', '4'), ('B', 'x', '1'), ('B', 'x', '2'), ('B', 'x', '3'), ('B', 'x', '4'), ('B', 'y', '1'), ('B', 'y', '2'), ('B', 'y', '3'), ('B', 'y', '4'), ('C', 'x', '1'), ('C', 'x', '2'), ('C', 'x', '3'), ('C', 'x', '4'), ('C', 'y', '1'), ('C', 'y', '2'), ('C', 'y', '3'), ('C', 'y', '4'), ('D', 'x', '1'), ('D', 'x', '2'), ('D', 'x', '3'), ('D', 'x', '4'), ('D', 'y', '1'), ('D', 'y', '2'), ('D', 'y', '3'), ('D', 'y', '4')]

 

[2차원 리스트를 1차원으로 변환]

my_list = [[1, 2], [3, 4], [5, 6]]
answer = []
for element in my_list:
    answer += element
    
my_list = [[1, 2], [3, 4], [5, 6]]

# 방법 1 - sum 함수
answer = sum(my_list, [])

# 방법 2 - itertools.chain
import itertools
list(itertools.chain.from_iterable(my_list))

# 방법 3 - itertools와 unpacking
import itertools
list(itertools.chain(*my_list))

# 방법 4 - list comprehension 이용
[element for array in my_list for element in array]

# 방법 5 - reduce 함수 이용 1
from functools import reduce
list(reduce(lambda x, y: x+y, my_list))

# 방법 6 - reduce 함수 이용 2
from functools import reduce
import operator
list(reduce(operator.add, my_list))

# 방법 7 - numpy 라이브러리의 flatten 이용 : 각 원소의 길이가 동일한 경우에만 사용 가능
import numpy as np
np.array(my_list).flatten().tolist()
  • sum(iterable, start=0)
    • iterable + start를 반환
    • start는 default값이 0이기 때문에 비어있는 리스트나 튜플이 들어올 경우 0을 반환
    • iterable이 비어있을 때 특정 값을 반환하게 하고 싶다면 해당 값을 두 번째 인자로 넣어주면 됨
  • itertools.chain(*iterables)
    • 첫 번째 iterable에서 소진될 때까지 요소를 반환 후, 다음 iterable로 넘어가는 식으로 모든 iterable이 소진될 때까지 진행하는 iterator 생성
    • 여러 시퀀스를 단일 시퀀스처럼 처리하는 데 사용
  • functools.reduce(function, iterable[, initializer])
    • function의 두 인자를 iterable의 요소에 왼쪽부터 오른쪽 순으로 적용
    • reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])의 경우, 왼쪽 인자 x는 누적값/오른쪽 인자 y는 iterable에서 온 갱신 값
    • initializer가 있으면 계산에서 iterable 항목 앞에 배치됨 (iterable이 비어있을 때 기본 값의 역할)

 

[순열과 조합]

import itertools

pool = ['A', 'B', 'C']
print(list(map(''.join, itertools.permutations(pool)))) # 3개의 원소로 수열 만들기
print(list(map(''.join, itertools.permutations(pool, 2)))) # 2개의 원소로 수열 만들기

print(list(map(''.join, itertools.combinations(pool)))) # 3개의 원소로 조합 만들기
print(list(map(''.join, itertools.combinations(pool, 2)))) # 2개의 원소로 조합 만들기

 

 

728x90

댓글