리스트에서 모든 쌍별 조합(pairwise combination)을 구해야 하는 경우, 중첩 반복문과 append 메서드를 활용하면 간단하게 해결할 수 있습니다. 이 글에서는 기본적인 반복문 방식과 함께 더 간결한 대안까지 소개합니다.
예제 코드
아래는 리스트의 모든 쌍별 조합을 구하는 파이썬 프로그램입니다.
my_list = [15,"John", 2, "Will", 53, 'Rob']
print("The list is :")
print(my_list)
my_result = []
for i in range(0,len(my_list)):
for j in range(0,len(my_list)):
if (i!=j):
my_result.append((my_list[i],my_list[j]))
print("The result is :")
print(my_result)
실행 결과
The list is :
[15, 'John', 2, 'Will', 53, 'Rob']
The result is :
[(15, 'John'), (15, 2), (15, 'Will'), (15, 53), (15, 'Rob'), ('John', 15), ('John', 2), ('John', 'Will'), ('John', 53), ('John', 'Rob'), (2, 15), (2, 'John'), (2, 'Will'), (2, 53), (2, 'Rob'), ('Will', 15), ('Will', 'John'), ('Will', 2), ('Will', 53), ('Will', 'Rob'), (53, 15), (53, 'John'), (53, 2), (53, 'Will'), (53, 'Rob'), ('Rob', 15), ('Rob', 'John'), ('Rob', 2), ('Rob', 'Will'), ('Rob', 53)]
코드 설명
리스트를 정의하고 콘솔에 출력합니다.
결과를 저장할 빈 리스트를 하나 정의합니다.
두 개의 중첩된 반복문을 사용하여 원본 리스트를 두 번 순회합니다.
두 인덱스
i와j가 서로 다른 경우에만, 해당 위치의 요소들을 튜플로 묶어 결과 리스트에 추가합니다. 이 조건 덕분에 자기 자신과의 조합은 자연스럽게 제외됩니다.최종적으로 완성된 결과 리스트가 콘솔에 출력됩니다.
참고: itertools로 더 간결하게 구현하기
파이썬 표준 라이브러리인 itertools의 permutations 함수를 사용하면 위 코드를 한 줄로 대체할 수 있습니다.
from itertools import permutations
my_list = [15, "John", 2, "Will", 53, 'Rob']
my_result = list(permutations(my_list, 2))
print("The result is :")
print(my_result)
permutations(my_list, 2)는 리스트 요소 중 2개를 순서를 고려하여 뽑는 모든 경우의 수를 생성하며, 앞서 소개한 중첩 반복문 방식과 동일한 결과를 반환합니다. 요소가 n개인 리스트의 경우 총 n×(n-1)개의 조합이 만들어지므로, 리스트가 클수록 결과의 크기도 빠르게 커진다는 점을 유의해야 합니다.