개요
리스트에서 주어진 합계(N)가 되는 길이 K의 그룹(조합)을 찾아야 하는 경우가 있습니다. 이럴 때 빈 리스트와 함께 itertools 모듈의 product 메서드, 그리고 내장 함수인 sum과 append 메서드를 활용하면 손쉽게 해결할 수 있습니다.
예제 코드
아래는 실제 동작을 보여주는 예제입니다.
from itertools import product
my_list = [45, 32, 67, 11, 88, 90, 87, 33, 45, 32]
print("The list is : ")
print(my_list)
N = 77
print("The value of N is ")
print(N)
K = 2
print("The value of K is ")
print(K)
my_result = []
for sub in product(my_list, repeat = K):
if sum(sub) == N:
my_result.append(sub)
print("The result is : " )
print(my_result)실행 결과
The list is : [45, 32, 67, 11, 88, 90, 87, 33, 45, 32] The value of N is 77 The value of K is 2 The result is : [(45, 32), (45, 32), (32, 45), (32, 45), (45, 32), (45, 32), (32, 45), (32, 45)]
코드 설명
필요한 패키지(
itertools.product)를 환경에 임포트합니다.정수 요소로 구성된 리스트를 정의하고 콘솔에 출력합니다.
목표 합계를 나타내는 N과 그룹의 길이를 나타내는 K 값을 정의한 뒤 콘솔에 출력합니다.
결과를 저장할 빈 리스트를 하나 생성합니다.
product메서드를 사용해 리스트 요소들로 만들 수 있는 길이 K의 모든 순서쌍(중복 허용)을 생성하고, 각 조합의 합이 N과 같은지 확인합니다.합이 N과 일치하는 조합은 미리 만들어 둔 빈 리스트에
append메서드로 추가합니다.마지막으로 최종 결과 리스트를 콘솔에 출력합니다.
참고 사항
product(my_list, repeat=K)는 데카르트 곱(Cartesian product)을 계산하므로 순서를 구분합니다. 따라서 (45, 32)와 (32, 45)처럼 같은 값이라도 순서가 다르면 별도의 결과로 포함됩니다. 순서에 상관없는 조합만 원한다면 itertools.combinations_with_replacement 또는 combinations를 대신 사용할 수 있습니다.