프로그래밍 개발 공부

[Python 학습] 2-5 리스트 놔두고 파이썬 집합(set)을 굳이 왜 쓸까? (중복 제거, 성능 비교 완벽 정리)

wikys 2026. 6. 22. 09:17
개발이나 데이터 분석을 하다 보면 이런 답답한 상황, 한 번쯤 겪어보셨을 겁니다. "수만 개의 방문자 로그에서 중복된 아이디만 깔끔하게 날려버릴 순 없을까?", "이 사용자가 이미 가입된 블랙리스트 회원인지 빠르게 확인해야 하는데, 리스트(List)로 반복문을 돌리니 프로그램이 너무 느려지네?".
단순히 데이터를 차곡차곡 쌓아서 보관하는 것이 목적이라면 우리가 흔히 아는 리스트(List)로도 충분합니다. 하지만 다루는 데이터의 양이 늘어나고, '고유성(중복 없음)''빠른 검색'이 핵심이 되는 순간 리스트는 분명한 한계를 보입니다.
이럴 때 여러분의 코드를 구원해 줄 아주 강력하고 매력적인 자료구조가 있습니다. 바로 파이썬의 집합(set)입니다. 단순히 기능이 독특한 자료구조가 아니라, 여러분의 코딩 효율과 프로그램의 성능을 비약적으로 높여줄 파이썬 집합(set)의 모든 것을 파헤쳐 보겠습니다.

 

--------------------------------------------------------------------------------

1. 파이썬 집합(set), 도대체 언제 필요한 걸까?
파이썬에서 집합(set)은 말 그대로 수학의 '집합' 개념을 프로그래밍에 가져온 자료구조입니다. 실무에서 집합이 빛을 발하는 순간은 크게 두 가지로 나뉩니다.
① 단 1초 만에 끝나는 '중복 제거' 수집한 이메일 목록, 상품 태그, 이미 처리한 주문 번호 등 동일한 값이 여러 번 등장하면 오히려 데이터 관리에 방해가 되는 경우가 많습니다. 리스트에 처럼 중복 데이터가 섞여 있을 때, 이를 set()으로 한 번 감싸주기만 하면 순식간에 중복이 사라지고 고유한 값만 남게 됩니다. 복잡한 조건문(if)이나 반복문(for)을 쓸 필요가 전혀 없습니다.
② 빛보다 빠른 '존재 여부(포함 여부) 확인' 어떤 값이 데이터 안에 이미 들어 있는지 확인하는 작업은 실무에서 매우 빈번합니다. 예를 들어 특정 단어가 금지어 목록에 있는지("spam" in blocked_words) 검사해야 한다고 가정해 보겠습니다. 리스트는 찾으려는 데이터가 나올 때까지 처음부터 끝까지 방을 하나씩 다 뒤져야 하므로 데이터가 커질수록 속도가 급격히 느려집니다(O(N)). 하지만 집합은 내부적으로 해시(Hash) 테이블이라는 구조를 사용하기 때문에 데이터가 1억 개라도 단번에(O(1)) 찾아냅니다. 실제 벤치마크 테스트에 따르면 5만 개의 데이터에서 포함 여부를 검사할 때, 집합이 리스트보다 무려 500배 이상 빠르다는 결과도 있습니다.

--------------------------------------------------------------------------------

2. 리스트(List) vs 집합(Set), 실전 선택 기준
리스트와 집합은 서로 경쟁하는 관계가 아니라, 해결하려는 문제의 성격에 따라 다르게 선택해야 하는 도구입니다. 다음과 같은 기준으로 판단해 보세요.
  • 리스트(List)를 선택해야 할 때 : 데이터의 '순서'가 중요하고, 동일한 값이 여러 번 반복해서 들어가도 괜찮은 경우 (예: 음악 재생목록, 날짜별 온도 기록).
  • 집합(Set)을 선택해야 할 때 : 데이터의 순서보다는 '존재 중심(있는지 없는지)'이 중요하며, 같은 값은 하나만 유지해야 하는 경우 (예: 중복을 허용하지 않는 장르 태그, 출입 명단, 금지어 목록).

--------------------------------------------------------------------------------

3. 초보자가 가장 많이 하는 실수와 주의점
파이썬 집합을 처음 사용할 때 가장 많이 헷갈리고 실수하는 포인트 세 가지를 짚어드립니다.
  • 인덱스로 접근하려 하지 마세요 : 집합은 '순서'라는 개념 자체가 존재하지 않는 비선형 자료구조입니다. 따라서 my_set처럼 몇 번째 위치를 지정해 값을 꺼내려 하면 에러(TypeError)가 발생합니다.
  • 출력 순서의 배신 : 코드를 실행했을 때, 내가 데이터를 넣은 순서와 다르게 출력된다고 당황할 필요가 없습니다. 집합의 본질은 데이터의 '위치'가 아니라 그 안에 '존재하는가'이기 때문입니다.
  • 빈 집합을 만들 때 {}는 금물 : 비어있는 집합을 생성할 때 무심코 중괄호 {}를 사용하면, 파이썬은 이를 빈 '딕셔너리(Dictionary)'로 인식합니다. 빈 집합을 만들 때는 반드시 set() 함수를 호출해야 합니다.

--------------------------------------------------------------------------------

4. 실무 코드 라인을 반으로 줄이는 강력한 집합 연산
집합 자료형의 진정한 매력은 수학적인 집합 연산을 코드 기호 하나로 끝낼 수 있다는 점입니다.
  • 교집합 (&) : 두 데이터 그룹에 공통으로 들어있는 요소만 추출합니다. (예: A 이벤트와 B 이벤트에 모두 참여한 고객 찾기).
  • 합집합 (|) : 두 그룹의 데이터를 중복 없이 하나로 합칩니다. (예: 두 부서의 전체 직원 명단 통합).
  • 차집합 (-) : 한쪽 그룹에서 겹치는 부분을 뺀 나머지만 남깁니다. (예: 전체 가입자 중 오늘 접속한 사람을 제외한 미접속자 목록 추출).
이러한 연산자나 전용 메서드(.intersection(), .union(), .difference())를 활용하면 반복문 여러 줄로 짜야 할 복잡한 필터링 로직을 단 한 줄의 코드로 우아하게 처리할 수 있습니다.

--------------------------------------------------------------------------------

💡 마무리 : 자료구조를 보는 시야 넓히기
파이썬 집합(set)은 단순히 기능이 부족한 리스트가 아닙니다. 집합을 이해하고 나면 코딩을 할 때 자료구조를 단순히 문법적인 모양으로 고르는 것이 아니라, '내가 지금 해결하려는 문제의 본질(순서인가, 존재 여부인가)이 무엇인가'를 기준으로 생각하게 됩니다.
데이터를 다루다가 "중복"이나 "빠른 탐색"이라는 단어가 머릿속에 떠오른다면, 주저 없이 집합(set)을 꺼내보시기 바랍니다.
 
반응형