본문 바로가기
Python/Python FAQ

Python 여러 개의 리스트의 카르테시안 곱을 얻는 방법은 무엇인가요?, How to get the Cartesian product of multiple lists

by 베타코드 2023. 10. 16.
반응형

질문


카테시안 곱(값들의 모든 가능한 조합)을 여러 개의 리스트 그룹에서 어떻게 얻을 수 있을까요?

예를 들어, 다음과 같이 주어졌을 때

somelists = [
   [1, 2, 3],
   ['a', 'b'],
   [4, 5]
]

어떻게 이를 얻을 수 있을까요?

[(1, 'a', 4), (1, 'a', 5), (1, 'b', 4), (1, 'b', 5), (2, 'a', 4), (2, 'a', 5), ...]

이 기술의 일반적인 응용 중 하나는 깊게 중첩된 루프를 피하는 것입니다. 더 구체적인 중복을 보려면 중첩된 for 루프 피하기를 참조하세요. 마찬가지로, 이 기술은 리스트 값을 가진 사전을 "펼치는" 데 사용될 수 있습니다. Python 사전 순열을 사전 목록으로 결합하기를 참조하세요.

동일한 리스트를 여러 번 자체와의 카테시안 곱을 원한다면, itertools.product를 사용하면 우아하게 처리할 수 있습니다. 리스트의 모든 쌍에 대한 작업 또는 리스트의 "반복 순열"을 어떻게 얻을 수 있을까요?를 참조하세요.

itertools.product에 대해 이미 알고 있는 많은 사람들은 입력 시퀀스마다 별도의 인수를 기대한다는 사실에 어려움을 겪습니다. 수락된 답변은 이를 *로 처리하는 방법을 보여줍니다. 그러나 여기서 인수를 풀어서 사용하는 *의 사용은 함수 호출에서 사용되는 다른 시간과 근본적으로 다르지 않습니다. 이 주제에 대해서는 튜플을 인수로 확장을 참조하세요(그리고 필요한 경우 이를 사용하여 중복 질문을 닫으세요).


답변


Python 2.6부터 사용 가능한 itertools.product을(를) 사용하세요.

import itertools

somelists = [
   [1, 2, 3],
   ['a', 'b'],
   [4, 5]
]
for element in itertools.product(*somelists):
    print(element)

이것은 다음과 동일합니다:

for element in itertools.product([1, 2, 3], ['a', 'b'], [4, 5]):
    print(element)
반응형

댓글