리스트를 가능한 모든 튜플 쌍 조합으로 분할해야 하는 경우가 있습니다. 이럴 때는 리스트를 매개변수로 받는 함수를 정의하고, 리스트 컴프리헨션(list comprehension)을 사용해 리스트를 순회하면서 extend 메서드를 활용하면 손쉽게 해결할 수 있습니다.
예제 코드
아래는 실제 동작을 보여주는 예제입니다.
def determine_pairings(my_list):
if len(my_list) <= 1:
return [my_list]
result = [[my_list[0]] + element for element in determine_pairings(my_list[1:])]
for index in range(1, len(my_list)):
result.extend([[(my_list[0], my_list[index])] + element for element in determine_pairings(my_list[1: index] + my_list[index + 1:])])
return result
my_list = [56, 31, 78, 0]
print("The list is :")
print(my_list)
my_result = determine_pairings(my_list)
print("The resultant pairs are :")
print(my_result)실행 결과
The list is : [56, 31, 78, 0] The resultant pairs are : [[56, 31, 78, 0], [56, 31, (78, 0)], [56, (31, 78), 0], [56, (31, 0), 78], [(56, 31), 78, 0], [(56, 31), (78, 0)], [(56, 78), 31, 0], [(56, 78), (31, 0)], [(56, 0), 31, 78], [(56, 0), (31, 78)]]
코드 설명
determine_pairings라는 이름의 함수를 정의하고, 리스트를 매개변수로 전달받습니다.리스트의 길이가 1 이하인지 확인하여, 그렇다면 해당 리스트를 그대로 반환합니다. 이것이 재귀 호출의 종료 조건 역할을 합니다.
첫 번째 요소를 제외한 나머지 요소들에 대해 같은 함수를 다시 호출(재귀 호출)하여 결과를 생성합니다.
생성된 결과를
result변수에 할당합니다.리스트를 다시 순회하면서 첫 번째 요소와 현재 인덱스의 요소를 튜플로 묶어 결과에 추가합니다.
모든 조합이 완성되면 최종 결과를 반환합니다.
정리
이 방식은 재귀와 리스트 컴프리헨션을 결합하여, 주어진 리스트에서 만들 수 있는 모든 튜플 쌍 조합을 체계적으로 탐색합니다. 원소 개수가 늘어날수록 조합의 수는 기하급수적으로 증가하므로, 큰 리스트에는 적용 시 성능을 고려해야 합니다.