프로그래밍을 하다 보면 주어진 리스트에서 중복된 요소를 걸러내고 데이터를 정제해야 하는 경우가 자주 발생합니다. 파이썬은 표준 라이브러리에서 제공하는 다양한 메서드를 조합하여 이 작업을 손쉽게 처리할 수 있습니다. 이번 글에서는 split()과 set(), 그리고 컴프리헨션을 활용해 리스트 내 부분 문자열의 중복을 제거하는 두 가지 방법을 살펴보겠습니다.
1. set()과 split() 조합으로 중복 제거
split() 메서드는 문자열을 특정 구분자를 기준으로 분리하는 역할을 하며, 분리된 결과물의 중복 여부를 검사하는 데 활용됩니다. 이어서 set()은 집합(set) 자료형의 특성상 중복 값을 허용하지 않기 때문에, 분리된 요소들 중 고유한 값만 자동으로 저장하게 됩니다.
예제 코드
# 리스트 초기화
listA = ['xy-xy', 'pq-qr', 'xp-xp-xp', 'dd-ee']
print("원본 리스트 : ", listA)
# set()과 split() 사용
res = [set(sub.split('-')) for sub in listA]
# 결과 출력
print("중복 제거 후 리스트 : ", res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
원본 리스트 : ['xy-xy', 'pq-qr', 'xp-xp-xp', 'dd-ee']
중복 제거 후 리스트 : [{'xy'}, {'pq', 'qr'}, {'xp'}, {'ee', 'dd'}]출력 결과를 보면 각 문자열이 하이픈(-)을 기준으로 분리되고, 각 요소별로 중복 없는 값만 집합 형태로 유지되는 것을 확인할 수 있습니다. 예를 들어 'xy-xy'는 중복된 xy가 제거되어 {'xy'}만 남게 됩니다.
2. 집합 컴프리헨션으로 전체 고유 요소 추출
두 번째 방법은 리스트 전체를 대상으로 모든 부분 문자열을 하나로 모아 중복을 제거하는 방식입니다. for 루프와 집합 컴프리헨션(set comprehension)을 함께 사용하면, 분리된 요소들 중 고유한 값들만 골라낼 수 있습니다.
예제 코드
# 리스트 초기화
listA = ['xy-xy', 'pq-qr', 'xp-xp-xp', 'dd-ee']
print("원본 리스트 : ", listA)
# 집합 컴프리헨션 사용
res = list({i for sub in listA for i in sub.split('-')})
# 결과 출력
print("중복 제거 후 리스트 : ", res)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
원본 리스트 : ['xy-xy', 'pq-qr', 'xp-xp-xp', 'dd-ee'] 중복 제거 후 리스트 : ['dd', 'pq', 'ee', 'xp', 'xy', 'qr']
이번에는 리스트에 있던 모든 문자열을 하이픈 기준으로 분리한 뒤, 전체 범위에서 중복을 제거하여 하나의 리스트로 반환합니다. 참고로 집합은 순서를 보장하지 않으므로, 실행할 때마다 출력 순서는 달라질 수 있습니다. 만약 순서를 유지하고 싶다면 dict.fromkeys()나 sorted()를 추가로 활용하면 됩니다.
마무리
정리하자면, 첫 번째 방법은 각 문자열 단위로 중복을 제거한 결과를 유지하고 싶을 때 적합하고, 두 번째 방법은 리스트 전체에서 고유한 부분 문자열만 뽑아내고 싶을 때 유용합니다. 상황에 맞는 방법을 선택하여 깔끔하게 데이터를 정제해 보시기 바랍니다.