IT & Programming/python

파이썬의 집합과 사전에 대해

오스카리 2025. 5. 12. 03:31

파이썬의 집합(set)사전(dictionary) 은 둘 다 컬렉션 자료형(collection data type) 에 속하며, 여러 데이터를 하나의 객체로 관리할 수 있게 해줍니다. 하지만 용도, 구조, 접근 방식에서 큰 차이가 있습니다. 아래에서 각각을 구조, 특징, 사용법, 예제 코드 순으로 상세하게 설명하겠습니다.

 

면접에 자주 등장하는 질문입니다. 몇번을 읽어보고 숙지하길 바랍니다. 


1. 집합(set)

1.1 개념

  • 집합(set)은 중복을 허용하지 않고, 순서가 없는 자료형입니다.
  • 수학의 집합 개념과 유사하게, 합집합, 교집합, 차집합 연산이 가능합니다.

1.2 특징

  • 요소는 중복되지 않으며, 순서가 보장되지 않음
  • 변경 가능한(mutable) 자료형이지만, 내부 요소는 변경 불가능한(immutable) 타입만 가능
  • 리스트나 튜플로 변환 가능

1.3 주요 메서드

메서드 설명

add(x) x를 추가
remove(x) x 제거 (x가 없으면 에러)
discard(x) x 제거 (x가 없어도 에러 없음)
clear() 모든 요소 제거
union(set2) 합집합
intersection(set2) 교집합
difference(set2) 차집합

1.4 예제

# 집합 생성
a = set([1, 2, 3])
b = {3, 4, 5}

# 요소 추가
a.add(4)

# 교집합
print(a & b)  # {3, 4}

# 합집합
print(a | b)  # {1, 2, 3, 4, 5}

# 차집합
print(a - b)  # {1, 2}

2. 사전(dictionary)

2.1 개념

  • 사전(dictionary)은 키(key)값(value) 의 쌍으로 데이터를 저장하는 매핑 자료형입니다.
  • 키는 중복될 수 없고, 값을 통해 빠르게 검색이 가능함.

2.2 특징

  • 순서는 Python 3.7 이상부터 입력 순서가 유지됨
  • 키는 변경 불가능한 자료형만 사용 가능 (문자열, 숫자, 튜플 등)
  • 값은 어떤 자료형도 가능

2.3 주요 메서드

메서드 설명

keys() 모든 키 반환
values() 모든 값 반환
items() (키, 값) 쌍 반환
get(key) 키에 해당하는 값 반환 (없으면 None)
update(dict2) dict2로 갱신
pop(key) 키 삭제 후 값 반환
clear() 전체 삭제

2.4 예제

# 사전 생성
person = {"name": "Alice", "age": 30, "job": "developer"}

# 요소 접근
print(person["name"])  # Alice
print(person.get("age"))  # 30

# 요소 추가/수정
person["age"] = 31
person["city"] = "Seoul"

# 요소 삭제
del person["job"]

# 키, 값, 쌍 출력
print(person.keys())    # dict_keys(['name', 'age', 'city'])
print(person.values())  # dict_values(['Alice', 31, 'Seoul'])
print(person.items())   # dict_items([('name', 'Alice'), ('age', 31), ('city', 'Seoul')])

3. 집합과 사전의 비교

항목 집합(set) 사전(dictionary)

구조 값(value)만 존재 키(key)-값(value) 쌍
중복 허용 허용 안 함 키는 중복 불가, 값은 가능
순서 없음 (3.7 이후에도 없음) 3.7 이후 삽입 순서 유지
접근 방식 포함 여부 확인 용이 키를 통해 값에 빠르게 접근
주요 활용 중복 제거, 수학적 연산 매핑(mapping), 데이터 저장

4. 실전 응용 예제

예제 1: 리스트에서 중복 제거

nums = [1, 2, 2, 3, 4, 4, 5]
unique = list(set(nums))
print(unique)  # [1, 2, 3, 4, 5] (순서는 보장되지 않음)

예제 2: 단어 빈도 수 세기

sentence = "python is easy and python is powerful"
words = sentence.split()

counter = {}
for word in words:
    counter[word] = counter.get(word, 0) + 1

print(counter)
# {'python': 2, 'is': 2, 'easy': 1, 'and': 1, 'powerful': 1}

요약

  • set: 중복 없는 값들의 모음. 집합 연산에 유리함.
  • dict: 키-값 구조로, 빠른 검색 및 매핑 용도에 적합.

구분 set dict

중복 불가 키만 불가
순서 없음 있음 (3.7+)
구성 키-값
주요 사용 중복 제거, 집합 연산 데이터 저장, 키 기반 조회

 

아래는 파이썬의 집합(set)과 사전(dictionary)을 JSON 파싱웹 크롤링 후 데이터 정제 과정에서 어떻게 실무적으로 사용하는지 구체적인 예시입니다. 각 사례는 실제 사용하는 코드와 함께 설명합니다.


1. JSON 파싱 + 중복 제거 및 필터링 (집합 + 사전 활용)

사례 시나리오

API로 받은 JSON 데이터에서 사용자 정보가 중복되거나 일부 정보가 누락되어 있습니다.
중복을 제거하고, 특정 필드 기준으로 필터링합니다.

입력 예 (API 응답 데이터)

[
  {"id": 1, "name": "Alice", "role": "admin"},
  {"id": 2, "name": "Bob", "role": "user"},
  {"id": 3, "name": "Alice", "role": "admin"},
  {"id": 4, "name": "Charlie", "role": "user"},
  {"id": 5, "name": "David", "role": null}
]

파싱 및 정제 예제 코드

import json

# JSON 문자열로 가정 (보통은 requests.get().json() 형태로 받음)
json_data = '''
[
  {"id": 1, "name": "Alice", "role": "admin"},
  {"id": 2, "name": "Bob", "role": "user"},
  {"id": 3, "name": "Alice", "role": "admin"},
  {"id": 4, "name": "Charlie", "role": "user"},
  {"id": 5, "name": "David", "role": null}
]
'''

data = json.loads(json_data)

# 중복 제거를 위한 set 사용 (이름과 역할이 동일한 경우 중복으로 간주)
seen = set()
filtered = []

for entry in data:
    if entry["role"] is None:
        continue  # 역할 없는 데이터는 제외
    
    key = (entry["name"], entry["role"])  # 중복 판별 기준
    if key not in seen:
        seen.add(key)
        filtered.append(entry)

for item in filtered:
    print(item)

출력 결과

{'id': 1, 'name': 'Alice', 'role': 'admin'}
{'id': 2, 'name': 'Bob', 'role': 'user'}
{'id': 4, 'name': 'Charlie', 'role': 'user'}

활용 설명

  • set을 통해 (이름, 역할) 기준 중복을 제거
  • dict(사전)는 각각의 항목 구조 자체이며, 각 항목을 필터링하거나 수정할 수 있음

2. 웹 크롤링 데이터 정제 (사전 + 집합 활용)

사례 시나리오

웹사이트에서 상품 정보를 크롤링했는데, 일부 제품명이 중복되며 카테고리별로 묶어야 합니다.

크롤링된 데이터 예시 (리스트 형태)

products = [
    {"name": "아이폰 14", "category": "전자제품"},
    {"name": "아이폰 14", "category": "전자제품"},
    {"name": "고양이 사료", "category": "반려동물"},
    {"name": "아이폰 13", "category": "전자제품"},
    {"name": "고양이 사료", "category": "반려동물"},
    {"name": "LED 조명", "category": "인테리어"}
]

정제 코드

from collections import defaultdict

# 중복 제거용 set
seen = set()

# 카테고리별 그룹핑용 dict
category_map = defaultdict(list)

for item in products:
    key = (item["name"], item["category"])
    
    if key not in seen:
        seen.add(key)
        category_map[item["category"]].append(item["name"])

# 결과 출력
for category, items in category_map.items():
    print(f"[{category}]")
    for name in items:
        print(f" - {name}")

출력 결과

[전자제품]
 - 아이폰 14
 - 아이폰 13
[반려동물]
 - 고양이 사료
[인테리어]
 - LED 조명

활용 설명

  • set으로 이름+카테고리 기준 중복 제거
  • defaultdict(list)로 사전 형태를 사용해 카테고리별로 자동 그룹핑 처리

3. 정리 요약

사용 기술 활용 목적 설명

set 중복 제거 JSON, 웹 크롤링 등에서 같은 항목 필터링
dict 필드 접근/정렬/매핑 JSON 구조 탐색, 필터링, 정리
defaultdict 자동 리스트 초기화 카테고리 분류, 키 누락 방지

이러한 방식으로 사전과 집합은 실무에서 데이터를 효율적으로 정리, 필터링, 그룹핑 하는 데에 매우 유용합니다.

 

 

 

다음은 뉴스 사이트쇼핑몰 사이트 데이터를 수집(crawling 또는 API 요청)한 뒤, 사전(dictionary)과 집합(set)을 활용하여 데이터를 정제하고, 중복 제거 및 분류하는 예제입니다.

각 예제는 실무 기준의 흐름(수집 → 정제 → 분류)으로 구성되어 있으며, 가상의 데이터셋을 이용한 코드 중심 설명입니다.


1. 뉴스 사이트 데이터 처리 예제 (카테고리 분류, 제목 중복 제거)

1.1 가정된 크롤링 결과

news_data = [
    {"title": "정부, 부동산 정책 발표", "category": "경제"},
    {"title": "정부, 부동산 정책 발표", "category": "경제"},
    {"title": "AI 기술 급성장", "category": "과학"},
    {"title": "코스피 2,500 돌파", "category": "경제"},
    {"title": "AI 기술 급성장", "category": "과학"},
    {"title": "영화 '듄2' 박스오피스 1위", "category": "문화"}
]

1.2 정제 및 분류 코드

from collections import defaultdict

seen_titles = set()  # 제목 중복 제거용
category_news = defaultdict(list)  # 카테고리별 분류

for article in news_data:
    title = article["title"]
    category = article["category"]
    
    if title not in seen_titles:
        seen_titles.add(title)
        category_news[category].append(title)

# 출력
for cat, titles in category_news.items():
    print(f"[{cat}]")
    for t in titles:
        print(f" - {t}")

1.3 출력 예시

[경제]
 - 정부, 부동산 정책 발표
 - 코스피 2,500 돌파
[과학]
 - AI 기술 급성장
[문화]
 - 영화 '듄2' 박스오피스 1위

2. 쇼핑몰 상품 데이터 처리 예제 (중복 제거 + 브랜드별 분류)

2.1 가정된 크롤링 데이터

product_data = [
    {"name": "나이키 에어맥스", "brand": "Nike"},
    {"name": "아디다스 슈퍼스타", "brand": "Adidas"},
    {"name": "나이키 에어맥스", "brand": "Nike"},
    {"name": "푸마 런닝화", "brand": "Puma"},
    {"name": "아디다스 슈퍼스타", "brand": "Adidas"},
    {"name": "나이키 덩크", "brand": "Nike"}
]

2.2 정제 및 분류 코드

seen_products = set()
brand_map = defaultdict(list)

for product in product_data:
    name = product["name"]
    brand = product["brand"]
    
    if (name, brand) not in seen_products:
        seen_products.add((name, brand))
        brand_map[brand].append(name)

# 출력
for brand, items in brand_map.items():
    print(f"[{brand}]")
    for item in items:
        print(f" - {item}")

2.3 출력 예시

[Nike]
 - 나이키 에어맥스
 - 나이키 덩크
[Adidas]
 - 아디다스 슈퍼스타
[Puma]
 - 푸마 런닝화

3. 활용 요약 및 실전 팁

사용 요소 목적 설명

set 제목 또는 상품 이름 중복 제거 빠른 탐색 시간 덕분에 효율적
defaultdict(list) 카테고리 또는 브랜드별 자동 분류 코드 간결화
dict 데이터 구조 표현 (JSON 유사) API/크롤링 결과 저장

실제 크롤링 적용 시

  • 뉴스: requests + BeautifulSoup + 기사 제목, 카테고리
  • 쇼핑몰: selenium 또는 API 활용하여 상품명, 브랜드, 가격 등 추출 가능

예시: 실시간 뉴스 API JSON 파싱 구조 예 (카카오 뉴스 API 등)

{
  "documents": [
    {
      "title": "정부, 부동산 대책 발표",
      "datetime": "2025-05-12T08:00:00",
      "url": "https://news.example.com/article1",
      "category": "정치"
    },
    ...
  ]
}

이 구조도 json.loads()로 파싱 후 동일한 로직(set, dict 활용)으로 분류 및 정제할 수 있습니다.


결론 요약

처리 대상 중복 제거 기준 분류 기준 활용 자료형

뉴스 데이터 기사 제목 카테고리 set + dict
쇼핑몰 상품 상품명 + 브랜드 브랜드 set + defaultdict

아래는 requests, BeautifulSoup, Selenium 세 가지 도구를 활용하여

  1. 네이버 뉴스 제목 수집 (requests + BeautifulSoup)
  2. 쿠팡 상품명 수집 (Selenium)
    을 실제로 구현한 예제입니다.

각 예제는 실무형 코드로 구성되어 있으며, set과 dict를 통한 중복 제거 및 분류 작업까지 포함되어 있습니다.


1. 네이버 뉴스 크롤링 (requests + BeautifulSoup)

1.1 크롤링 대상

※ 네이버는 기본적으로 뉴스 검색 결과를 iframe 또는 자바스크립트로 처리하므로,
뉴스 본문 크롤링은 어려울 수 있으나 제목 수집은 가능합니다.

1.2 코드

import requests
from bs4 import BeautifulSoup

query = "부동산"
url = f"https://search.naver.com/search.naver?where=news&query={query}"

headers = {
    "User-Agent": "Mozilla/5.0"
}

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "html.parser")

# 뉴스 제목 수집
titles = soup.select(".news_tit")  # 뉴스 제목 링크

seen = set()
for title_tag in titles:
    title = title_tag.get("title")
    if title and title not in seen:
        seen.add(title)
        print(f"- {title}")

1.3 출력 예시

- 정부, 부동산 세제 완화 검토
- 서울 아파트값 6주 연속 상승
- 청년 위한 부동산 정책 필요
...

2. 쿠팡 상품 정보 수집 (Selenium)

2.1 크롤링 대상

2.2 환경 준비

pip install selenium

그리고 크롬 브라우저 버전에 맞는 ChromeDriver를 설치해야 합니다.
예: chromedriver 실행파일을 PATH에 등록하거나 코드에서 직접 경로 지정.

2.3 코드

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time

# 웹 드라이버 실행
driver = webdriver.Chrome()  # 또는 ChromeDriver 경로 지정

# 쿠팡 메인 페이지 열기
driver.get("https://www.coupang.com/")

# 검색어 입력 및 엔터
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("아이폰")
search_box.send_keys(Keys.RETURN)

# 로딩 대기
time.sleep(3)

# 상품명 추출
products = driver.find_elements(By.CSS_SELECTOR, "div.name")

# 중복 제거
seen = set()
for p in products:
    name = p.text.strip()
    if name and name not in seen:
        seen.add(name)
        print(f"- {name}")

driver.quit()

2.4 출력 예시

- Apple 아이폰 14 프로 128GB
- 애플 정품 라이트닝 케이블
- 아이폰 케이스 투명 방탄
...

3. 정리 요약

항목 네이버 뉴스 쿠팡 상품

기술 requests + BeautifulSoup Selenium (자바스크립트 대응)
처리 대상 뉴스 검색 결과 검색 상품 리스트
중복 제거 set() 사용 set() 사용
필터링/분류 검색어 기준 브랜드, 키워드 등

4. 보안 및 차단 대응 팁

  • requests 사용 시 User-Agent 필수
  • Selenium 사용 시 time.sleep 또는 WebDriverWait 사용
  • 자동화 차단 회피용으로 headless 옵션 및 proxy 사용 가능

 

반응형