어제 오늘 내일

[Python 기초] "겹치는 데이터만 골라내자!" 리스트 교집합 찾기 3가지 비법 본문

IT/Python

[Python 기초] "겹치는 데이터만 골라내자!" 리스트 교집합 찾기 3가지 비법

hi.anna 2026. 5. 22. 10:00

 
예를 들어 '어제 방문한 고객 명단'과 '오늘 방문한 고객 명단'이 있을 때, "이틀 연속 방문한 단골손님"을 찾으려면 두 리스트의 교집합을 구해야 합니다. 파이썬에서는 어떻게 할까요?


1. 가장 정석적인 방법: 집합()과  연산자

파이썬의 집합(set) 자료형은 수학의 집합 연산을 완벽하게 지원합니다. 리스트를 집합으로 바꾼 뒤 & (앰퍼샌드) 기호 하나만 쓰면 끝납니다.

📌 예제 코드: & 연산자 활용

list_a = ["사과", "바나나", "포도", "딸기"]
list_b = ["포도", "딸기", "수박", "참외"]

# 1. 리스트를 집합으로 변환
set_a = set(list_a)
set_b = set(list_b)

# 2. '&' 기호로 교집합 구하기
common = set_a & set_b

# 3. 다시 리스트로 변환 (필요한 경우)
result = list(common)

print("공통 요소:", result)
# 출력: ['포도', '딸기'] (순서는 바뀔 수 있습니다)

2. 가독성이 좋은 방법:  함수

기호(&) 대신 이름을 직접 부르는 함수를 사용하는 방법입니다. 코드가 더 명시적이어서 다른 사람이 읽을 때 "아, 교집합을 구하고 있구나!"라고 바로 이해하기 좋습니다.

📌 예제 코드: intersection 함수 활용

list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]

# 한 줄로 요약해서 쓰기
common = list(set(list1).intersection(list2))

print("겹치는 숫자:", common)
# 출력: [4, 5]

3. 순서를 유지해야 할 때: 리스트 컴프리헨션

집합(set)을 쓰면 중복 제거와 속도 면에서 유리하지만, 데이터의 순서가 뒤죽박죽 섞인다는 단점이 있습니다. 만약 "list_a에 들어있는 순서대로" 겹치는 값을 찾고 싶다면 리스트 컴프리헨션을 사용해야 합니다.

📌 예제 코드: 순서 유지 교집합

list_a = ["A", "B", "C", "D"]
list_b = ["C", "E", "A", "F"]

# list_a에서 하나씩 꺼내는데, 그게 list_b에도 들어있는 경우만 모으기
# (이때 list_b를 set으로 미리 바꿔두면 속도가 훨씬 빨라집니다!)
set_b = set(list_b)
common = [item for item in list_a if item in set_b]

print("순서 유지 교집합:", common)
# 출력: ['A', 'C'] (list_a에 나타난 순서대로 'A'가 'C'보다 먼저 나옵니다)

📝 한눈에 비교하는 요약

방법 특징 추천 상황
set_a & set_b 가장 짧고 빠름 순서가 상관없을 때 (가장 권장)
.intersection() 의미가 명확함 가독성이 중요한 협업 프로젝트
리스트 컴프리헨션 순서 유지 가능 원본의 순서가 중요할 때

💡 보너스 팁: 3개 이상의 리스트라면?

세 개 이상의 리스트에서 공통 요소를 찾을 때도 set은 강력합니다.
set(list1) & set(list2) & set(list3) 처럼 계속 이어 붙여주기만 하면 됩니다.

 

반응형
Comments