itertools
단순한 루핑을 효율적으로 만들어주는 라이브러리
DAY21 의 TIL 에서 itertools 의 용도를 간략하게 설명했었으나 정확한 사용법에 대해서는 찾아보지 못했었다. 이번에는 해당 라이브러리에 들어있는 함수들을 좀 더 살펴보기로 했다.
DAY21 에서 언급한 'from itertools import product' 는 itertools 의 함수 중 하나에 불과했다.
입력 iterable에서 요소를 중복 없이 r개씩 뽑아 가능한 모든 조합을 생성한다.
순서를 고려하지 않기에 (m,n) 과 (n,m) 을 중복된 데이터로 판단한다.
from itertools import combinations
data = [1, 2, 3]
result = list(combinations(data, 2))
print(result)
#결과: [(1, 2), (1, 3), (2, 3)]
입력 iterable에서 요소를 중복 없이 r개씩 뽑아 가능한 모든 순열을 생성한다.
순서를 고려하기에 (m,n) 과 (n,m) 을 다른 데이터로 판단한다.
from itertools import permutations
data = [1, 2, 3]
result = list(permutations(data, 2))
print(result)
#결과: [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
주어진 iterable들로 가능한 모든 곱을 도출한다.
repeat는 각 iterable을 얼마나 반복할지 결정한다.
from itertools import product
a = [1, 2]
b = [3, 4]
result = list(product(a, b))
print(result)
#결과: [(1, 3), (1, 4), (2, 3), (2, 4)]
combinations_with_replacement(iterable, r) 과 같은 구조를 쓴다.
iterable에서 요소를 중복을 허용하여 r개씩 뽑아 가능한 모든 조합을 도출한다.
from itertools import combinations_with_replacement
data = [1, 2, 3]
result = list(combinations_with_replacement(data, 2))
print(result)
#결과: [(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]
여러 iterable을 인수로 받아 하나의 iterable처럼 동작하는 반복자를 생성한다.
iterable들을 합치기 위해 쓸 수 있다.
from itertools import chain
data1 = [1, 2, 3]
data2 = ['a', 'b', 'c']
result = list(chain(data1, data2))
print(result)
#결과: [1, 2, 3, 'a', 'b', 'c']
입력 iterable을 무한히 반복하는 반복자를 생성한다.
from itertools import cycle
data = [1, 2, 3]
inf_cycle = cycle(data)
for i in range(10):
print(next(inf_cycle))
#결과:
1
2
3
1
2
3
1
2
3
1
iterable의 누적 합을 계산하여 반환한다. func 인수를 통해 다른 누적 함수를 사용할 수 있다.
from itertools import accumulate
import operator
data = [1, 2, 3, 4]
# 앞에서부터 순서대로 덧셈 (1=1, 1+2=3, 3+3=6, 6+4=10)
result = list(accumulate(data))
print(result)
# operator.mul 붙일 시 곱셈으로 변환 (1=1, 1*2=2, 2*3=6, 6*4=24)
result = list(accumulate(data, operator.mul))
print(result)
iterable을 key 함수로 그룹화한다.
from itertools import groupby
data = sorted([('a', 1), ('b', 2), ('a', 3), ('b', 4)], key=lambda x: x[0])
grouped = groupby(data, key=lambda x: x[0])
for key, group in grouped:
print(key, list(group))
#결과:
a [('a', 1), ('a', 3)]
b [('b', 2), ('b', 4)]
[문제]
한국중학교에 다니는 학생들은 각자 정수 번호를 갖고 있습니다. 이 학교 학생 3명의 정수 번호를 더했을 때 0이 되면 3명의 학생은 삼총사라고 합니다. 예를 들어, 5명의 학생이 있고, 각각의 정수 번호가 순서대로 -2, 3, 0, 2, -5일 때, 첫 번째, 세 번째, 네 번째 학생의 정수 번호를 더하면 0이므로 세 학생은 삼총사입니다. 또한, 두 번째, 네 번째, 다섯 번째 학생의 정수 번호를 더해도 0이므로 세 학생도 삼총사입니다. 따라서 이 경우 한국중학교에서는 두 가지 방법으로 삼총사를 만들 수 있습니다.
한국중학교 학생들의 번호를 나타내는 정수 배열 number가 매개변수로 주어질 때, 학생들 중 삼총사를 만들 수 있는 방법의 수를 return 하도록 solution 함수를 완성하세요.
[제한사항]
- 3 ≤ number의 길이 ≤ 13
- -1,000 ≤ number의 각 원소 ≤ 1,000
- 서로 다른 학생의 정수 번호가 같을 수 있습니다.
[풀이]
from itertools import combinations
def solution(number):
return sum(1 for combo in combinations(number, 3) if sum(combo) == 0)