목록으로

프로그래밍 · Python

Python 입문 시리즈 #12: Set으로 중복 데이터 제거하기

BeanCon
Python 입문자가 Set으로 중복 데이터 제거와 집합 연산을 학습하는 과정을 표현한 대표 이미지

Python 입문 시리즈 12편입니다. Set이 필요한 이유, 중복 데이터 제거, 순서가 없는 자료구조의 특징, 빠른 존재 여부 확인, 데이터 추가와 삭제, 교집합·합집합·차집합, 보안 로그 분석, AI와 NLP 활용, 초보자가 자주 하는 실수까지 정리했습니다.

1. 사라진 회원 수의 비밀

어느 날 신입 개발자 민수는 회사 데이터베이스를 확인하다가 이상한 점을 발견했습니다. 회원 수는 100만 명이라고 들었는데, 이메일 목록에는 무려 130만 개가 저장되어 있었습니다.

민수는 데이터를 분석하기 시작했습니다.

emails = [
    "kim@gmail.com",
    "lee@gmail.com",
    "park@gmail.com",
    "kim@gmail.com",
    "lee@gmail.com"
]
문제의 핵심

똑같은 이메일이 여러 번 저장되어 있었습니다. 이런 중복 데이터는 실제 회원 수 계산, 통계, 과금, 마케팅 대상 추출에서 큰 오류를 만들 수 있습니다.

선임 개발자는 Set을 사용하면 바로 해결할 수 있다고 말했습니다. Python의 Set은 중복 데이터를 자동으로 제거하는 자료구조입니다.

2. Set이 필요한 이유

지금까지 배운 자료구조는 각자 다른 목적을 가집니다. List와 Tuple은 중복을 허용하고, Dictionary도 Value 중복은 허용합니다.

기존 자료구조의 중복 허용

List는 중복을 허용합니다.

["사과", "바나나", "사과"]

Tuple도 중복을 허용합니다.

("사과", "바나나", "사과")

Dictionary는 Key는 중복될 수 없지만 Value는 중복될 수 있습니다.

{
    "fruit1": "사과",
    "fruit2": "사과"
}

하지만 현실에서는 중복 데이터가 오히려 문제인 경우가 많습니다.

중복될 필요가 없는 데이터
  • 회원 이메일
  • IP 주소
  • 국가 코드
  • 태그 목록
  • 검색 키워드
  • 해시값
Set의 목적

Python은 중복을 자동으로 제거하는 특별한 자료구조로 Set을 제공합니다.

3. Set 기본 개념

신입 개발자 민수의 이메일 중복 문제를 Set으로 해결해보겠습니다.

emails = [
    "kim@gmail.com",
    "lee@gmail.com",
    "park@gmail.com",
    "kim@gmail.com",
    "lee@gmail.com"
]

List를 Set으로 변환합니다.

unique_emails = set(emails)

print(unique_emails)

결과입니다.

{
'kim@gmail.com',
'lee@gmail.com',
'park@gmail.com'
}

중복 이메일이 모두 사라졌습니다.

Set 생성 방법

Set은 중괄호로 만들 수 있습니다.

fruits = {"사과", "바나나", "포도"}

또는 set() 함수를 사용할 수도 있습니다.

fruits = set(["사과", "바나나", "포도"])

출력해보겠습니다.

print(fruits)

결과입니다.

{'사과', '포도', '바나나'}
Set의 중요한 특징

출력 순서가 입력 순서와 다를 수 있습니다. Set은 순서를 보장하지 않습니다.

Set은 순서가 없습니다

자료구조예시특징
List["A", "B", "C"]순서를 보장합니다.
Tuple("A", "B", "C")순서를 보장하고 수정할 수 없습니다.
Set{"A", "B", "C"}순서를 보장하지 않고 중복을 제거합니다.

Set의 목적은 빠른 검색과 중복 제거입니다. 그래서 몇 번째 데이터인지보다 값이 존재하는지, 중복이 있는지를 다루는 데 집중합니다.

4. 빠른 검색과 데이터 변경

Set은 값의 존재 여부를 매우 빠르게 확인합니다. 수백만 건의 데이터에서도 List보다 훨씬 빠르게 동작하는 경우가 많습니다.

IP 존재 여부 확인

logs = {
    "10.0.0.1",
    "10.0.0.2",
    "10.0.0.3"
}
print("10.0.0.2" in logs)

결과입니다.

True

Set 데이터 추가

fruits = {"사과", "바나나"}
fruits.add("포도")

결과를 출력합니다.

print(fruits)

결과입니다.

{'사과', '바나나', '포도'}

중복 추가 시도

fruits.add("사과")

결과를 다시 출력합니다.

print(fruits)

결과입니다.

{'사과', '바나나', '포도'}

이미 존재하는 값이기 때문에 아무 일도 일어나지 않습니다.

Set 데이터 삭제

fruits.remove("사과")

결과를 출력합니다.

print(fruits)

결과입니다.

{'바나나', '포도'}

5. 집합 연산

Set이 진짜 빛나는 순간은 수학의 집합 연산을 그대로 사용할 때입니다.

두 집합을 준비합니다.

A = {1, 2, 3, 4}
B = {3, 4, 5, 6}
연산의미Python 코드결과
교집합 Intersection둘 다 가지고 있는 데이터A & B{3, 4}
합집합 Union모든 데이터를 합친 결과A | B{1, 2, 3, 4, 5, 6}
차집합 DifferenceA에만 있는 데이터A - B{1, 2}

교집합 Intersection

print(A & B)

결과입니다.

{3, 4}
교집합 실무 활용
  • 공통 고객 찾기
  • 공통 관심사 분석
  • 공통 태그 검색

합집합 Union

print(A | B)

결과입니다.

{1, 2, 3, 4, 5, 6}
합집합 실무 활용
  • 데이터 병합
  • 회원 통합
  • 로그 통합

차집합 Difference

print(A - B)

결과입니다.

{1, 2}
차집합 실무 활용
  • 신규 고객 찾기
  • 누락 데이터 탐지
  • 이상 탐지

6. 보안 로그 활용

실제 보안 시스템에서는 어제와 오늘의 IP 목록을 비교해 새롭게 등장한 IP를 찾을 수 있습니다.

yesterday_ips = {
    "10.0.0.1",
    "10.0.0.2",
    "10.0.0.3"
}

today_ips = {
    "10.0.0.2",
    "10.0.0.3",
    "10.0.0.4"
}

오늘 새롭게 등장한 IP를 찾습니다.

new_ips = today_ips - yesterday_ips

print(new_ips)

결과입니다.

{'10.0.0.4'}
보안관제 활용

실제 보안관제 SOC 시스템에서도 로그 집합을 비교해 신규 IP, 이상 징후, 누락 이벤트를 탐지하는 방식이 사용됩니다.

7. AI 개발 활용

AI 개발에서도 Set은 자주 사용됩니다. 특히 자연어 처리, 검색엔진, 추천시스템에서는 중복 단어 제거와 고유 키워드 추출이 중요합니다.

words = [
    "AI",
    "Python",
    "AI",
    "Machine",
    "Python"
]
unique_words = set(words)

print(unique_words)

결과입니다.

{'AI', 'Python', 'Machine'}
Set이 자주 등장하는 AI 분야
  • 자연어 처리 NLP
  • 검색엔진
  • 추천시스템
  • 키워드 추출
  • 중복 문서 제거

8. 자주 하는 실수

실수 1: 순서를 기대한다

data = {"A", "B", "C"}

print(data[0])

결과입니다.

TypeError

Set은 인덱스가 없습니다. 순서가 필요한 데이터라면 List나 Tuple을 사용해야 합니다.

실수 2: 중복 저장을 기대한다

data = {1, 1, 1, 1}

결과입니다.

{1}

Set은 중복을 허용하지 않기 때문에 하나만 남습니다.

실수 3: 빈 Set 생성

다음 코드는 빈 Set이 아니라 빈 Dictionary를 만듭니다.

data = {}

올바른 빈 Set 생성 방법입니다.

data = set()
상황잘못된 코드올바른 코드
빈 Set 만들기data = {}data = set()
순서 접근data[0]Set은 인덱스 접근 불가
중복 저장{1, 1, 1}{1}만 남음

9. 자료구조 정리와 다음 편 예고

지금까지 배운 자료구조를 다시 정리해보겠습니다.

자료구조예시핵심 특징
List["A", "B", "A"]순서가 중요하고 중복을 허용합니다.
Tuple("A", "B", "A")수정할 수 없고 중복을 허용합니다.
Dictionary{"name": "Lee"}Key 기반으로 값을 조회합니다.
Set{"A", "B"}중복 제거, 빠른 검색, 집합 연산에 강합니다.

민수의 130만 건 이메일 문제도 Set을 적용하면 실제 고유 회원 수를 계산할 수 있습니다.

emails = [...]
unique_emails = set(emails)

결과입니다.

130만 건 → 실제 회원 100만 명
오늘의 한 문장

List가 모든 기록을 저장하는 노트라면, Set은 중복을 허용하지 않는 출입명부입니다. 데이터가 많아질수록 Set의 진가가 드러납니다.

핵심 정리
  • Set은 중복 데이터를 자동으로 제거합니다.
  • Set은 순서를 보장하지 않습니다.
  • Set은 값의 존재 여부를 빠르게 확인할 수 있습니다.
  • add()로 값을 추가하고 remove()로 값을 삭제합니다.
  • 교집합, 합집합, 차집합 같은 집합 연산을 지원합니다.
  • 보안 로그, NLP, 검색엔진, 추천시스템에서 유용하게 사용됩니다.
Python 입문 연재 13 예고
  • 파일 File 입출력 이해하기
  • 프로그램이 종료되어도 데이터를 저장하는 방법
  • Python이 단순 계산기를 넘어 실제 애플리케이션처럼 동작하는 과정

댓글

0

댓글을 불러오는 중입니다.