주어진 튜플 목록에서 첫 번째 값이 중복되는 튜플을 제거해야 하는 경우, 간단한 for 반복문과 add, append 메서드를 활용하면 손쉽게 해결할 수 있습니다.
핵심 아이디어는 이미 확인한 첫 번째 값을 집합(set)에 저장해 두고, 새로운 값이 나타날 때만 결과 리스트에 추가하는 것입니다. 집합은 해시 기반으로 구현되어 있어 특정 값의 존재 여부를 평균적으로 O(1) 시간에 검사할 수 있으므로, 전체 과정이 O(n) 복잡도로 매우 효율적으로 동작합니다.
예제
my_input = [(45.324, 'Hi Jane, how are you'),(34252.85832, 'Hope you are good'),(45.324, 'You are the best.')]
visited_data = set()
my_output_list = []
for a, b in my_input:
if not a in visited_data:
visited_data.add(a)
my_output_list.append((a, b))
print("튜플 목록 : ")
print(my_input)
print("중복 제거 후의 튜플 목록 :")
print(my_output_list)출력 결과
튜플 목록 : [(45.324, 'Hi Jane, how are you'), (34252.85832, 'Hope you are good'), (45.324, 'You are the best.')] 중복 제거 후의 튜플 목록 : [(45.324, 'Hi Jane, how are you'), (34252.85832, 'Hope you are good')]
코드 설명
- 먼저 첫 번째 값이 중복된 튜플을 포함하는 목록을 정의하고 콘솔에 출력합니다.
- 이미 확인한 값을 기록할 빈 집합(
visited_data)과, 결과를 저장할 빈 리스트(my_output_list)를 생성합니다. - 튜플 목록을 순회하면서 각 튜플의 첫 번째 값(
a)이 집합에 없는 경우에만, 해당 값을 집합에 추가하고 튜플 전체를 결과 리스트에 함께 추가합니다. - 이렇게 하면 첫 번째 값이 같은 튜플 중 가장 먼저 등장한 것만 남게 되며, 최종 결과가 콘솔에 출력됩니다.
참고: 딕셔너리를 활용한 대안
파이썬 3.7 이상에서는 딕셔너리가 삽입 순서를 유지하므로, setdefault 메서드를 사용해 다음과 같이 구현할 수도 있습니다. 역시 가장 먼저 등장한 튜플이 유지됩니다.
unique_dict = {}
for a, b in my_input:
unique_dict.setdefault(a, (a, b))
my_output_list = list(unique_dict.values())
print(my_output_list)
# [(45.324, 'Hi Jane, how are you'), (34252.85832, 'Hope you are good')]두 방식 모두 원본 목록의 순서를 그대로 유지한다는 장점이 있으며, 데이터 크기가 클수록 집합이나 딕셔너리를 활용한 접근이 단순 중첩 반복문보다 훨씬 빠릅니다.