Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 튜플 목록에서 첫 번째 값이 중복되는 튜플 제거하기

주어진 튜플 목록에서 첫 번째 값이 중복되는 튜플을 제거해야 하는 경우, 간단한 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')]

두 방식 모두 원본 목록의 순서를 그대로 유지한다는 장점이 있으며, 데이터 크기가 클수록 집합이나 딕셔너리를 활용한 접근이 단순 중첩 반복문보다 훨씬 빠릅니다.