튜플로 구성된 두 개의 리스트에서 교차 페어링(cross pairing)을 수행해야 하는 경우가 종종 있습니다. 예를 들어, 첫 번째 요소(키 역할)가 서로 일치하는 튜플끼리 짝지어 두 번째 요소들을 새로운 튜플로 묶는 작업입니다.
이러한 작업은 파이썬 내장 함수인 zip() 메서드와 리스트 컴프리헨션(list comprehension), 그리고 '==' 비교 연산자를 조합하면 간결하게 구현할 수 있습니다.
동작 원리
zip(): 두 리스트를 인덱스 기준으로 묶어 순회 가능한 쌍을 만듭니다.a[0] == b[0]: 각 튜플의 첫 번째 요소를 비교하여 일치 여부를 확인합니다.- 리스트 컴프리헨션: 조건을 만족하는 경우에만
(a[1], b[1])형태의 새 튜플을 생성합니다.
예제 코드
아래는 전체 동작 과정을 보여주는 예제입니다.
my_list_1 = [('Hi', 'Will'), ('Jack', 'Python'), ('Bill', 'Mills'), ('goodwill', 'Jill')]
my_list_2 = [('Hi', 'Band'), ('Jack', 'width'), ('Bill', 'cool'), ('a', 'b')]
print("The first list is : ")
print(my_list_1)
print("The second list is : ")
print(my_list_2)
# 정렬하지 않으면 같은 키가 다른 위치에 있을 때 매칭되지 않음
my_list_1.sort()
my_list_2.sort()
print("The first list after sorting is : ")
print(my_list_1)
print("The second list after sorting is : ")
print(my_list_2)
my_result = [(a[1], b[1]) for a, b in zip(my_list_1, my_list_2) if a[0] == b[0]]
print("The resultant list is : ")
print(my_result)실행 결과
The first list is :
[('Hi', 'Will'), ('Jack', 'Python'), ('Bill', 'Mills'), ('goodwill', 'Jill')]
The second list is :
[('Hi', 'Band'), ('Jack', 'width'), ('Bill', 'cool'), ('a', 'b')]
The first list after sorting is :
[('Bill', 'Mills'), ('Hi', 'Will'), ('Jack', 'Python'), ('goodwill', 'Jill')]
The second list after sorting is :
[('Bill', 'cool'), ('Hi', 'Band'), ('Jack', 'width'), ('a', 'b')]
The resultant list is :
[('Mills', 'cool'), ('Will', 'Band'), ('Python', 'width')]단계별 설명
- 두 개의 튜플 리스트를 정의하고 콘솔에 출력합니다.
sort()를 호출해 두 리스트를 모두 오름차순으로 정렬한 뒤 출력합니다. 정렬은 필수 단계는 아니지만, 같은 키를 가진 튜플이 서로 다른 위치에 있을 때도 올바르게 매칭되도록 보장합니다.zip()으로 두 리스트를 묶어 동시에 순회하며, 리스트 컴프리헨션 안에서 각 튜플의 첫 번째 요소(a[0]와b[0])를 비교합니다.- 두 요소가 같으면 두 번째 요소들로 구성된 새 튜플
(a[1], b[1])을 결과 리스트에 저장합니다. - 키가 일치하지 않는 쌍(예:
('goodwill', ...)과('a', ...))은 자동으로 제외됩니다. - 최종 결과 리스트가 콘솔에 출력됩니다.
참고 사항
만약 리스트가 이미 정렬되어 있거나 순서가 항상 일치한다면 sort() 단계를 생략할 수 있습니다. 반대로 키의 중복이 있거나 대량의 데이터를 다룬다면, O(n²)에 가까운 정렬·비교 방식 대신 딕셔너리(dictionary)를 활용한 조회 방식이 더 효율적일 수 있습니다.