Python 강좌 / 집합으로 중복 제거하고 자료형 선택하기
집합은 중복 없는 항목을 저장하고 포함 여부나 두 모음의 관계를 계산하는 자료형입니다. 순서나 중복 횟수가 필요하면 집합으로 바꾸기 전에 그 정보가 사라져도 되는지 확인해야 합니다.
집합과 빈 중괄호 구분하기
집합은 {"food", "books"}처럼 만들고 빈 집합은 set()으로 만듭니다. 빈 중괄호 {}는 딕셔너리입니다. 항목에는 해시 가능한 값이 필요하며 리스트나 딕셔너리는 직접 넣을 수 없습니다. 집합에는 인덱스가 없고 출력 순서를 데이터 계약으로 사용할 수 없습니다.
관련 동작과 지원 조건은 집합으로 중복 제거하고 자료형 선택하기 관련 공식 문서에서 확인할 수 있습니다.
| 연산 | 뜻 |
|---|---|
| a | b | 합집합 |
| a & b | 교집합 |
| a - b | 차집합 |
| a ^ b | 한쪽에만 있는 항목 |
전체 예제와 실행 결과
별도의 실습 폴더에서 아래 파일을 UTF-8로 저장합니다. 가상환경을 선택한 터미널에서 python sets.py 명령으로 실행합니다. macOS·Ubuntu에서 가상환경을 사용하지 않는 경우 명령 이름을 python3으로 바꿉니다.
sets.py 파일의 전체 내용입니다.
used = {"food", "transport", "food"}
allowed = {"food", "books"}
print(sorted(used))
print(sorted(used & allowed))
print(sorted(used - allowed))
used.discard("missing")
print("food" in used)
예상 결과는 다음과 같습니다.
['food', 'transport'] ['food'] ['transport'] True
중복 제거와 검증에 활용하기
같은 값이 여러 번 등장해도 집합에는 하나만 남습니다. 예제의 used - allowed는 허용 목록에 없는 transport를 찾습니다. 결과를 화면에 안정적으로 표시하려고 sorted로 정렬했으며, 집합 자체가 정렬된 것은 아닙니다.
순서를 유지하며 문자열의 중복만 제거하려면 list(dict.fromkeys(items)) 같은 방법을 사용할 수 있습니다. 다만 원래 몇 번 등장했는지는 별도로 집계해야 합니다. 중복 제거가 잘못된 원본 데이터를 덮어버리는 정제인지, 허용되는 변환인지 먼저 구분합니다.
삭제 오류와 자료형 선택하기
remove는 항목이 없으면 KeyError를 발생시키고 discard는 없어도 넘어갑니다. 반드시 존재해야 할 항목을 지울 때는 remove가 문제를 드러내는 데 도움이 될 수 있습니다. 없어도 되는 선택 항목에는 discard가 자연스럽습니다.
같은 food를 한 번 더 추가해도 크기가 늘지 않는지, books를 used에 추가하면 교집합이 어떻게 바뀌는지 확인합니다. 금액 목록의 중복이 실제로 여러 지출을 의미한다면 set으로 중복 제거하면 합계가 틀어집니다. 순서가 필요하면 리스트, 고정된 위치의 묶음이면 튜플, 필드 이름이 필요하면 딕셔너리를 선택합니다.










