[Python] 집합(Set)과 자료형 변환

집합(Set)

fruits = {"사과", "바나나", "딸기"}
  • 집합은 파이썬에서 중복을 허용하지 않고, 순서가 없는 자료형
  • 데이터의 유일성을 보장하거나, 중복을 제거해야 할 때 유용하게 사용됨

집합의 특징

  • 중복을 허용하지 않음
  • 순서가 없음
    • 따라서 인덱스로 특정 위치에 접근할 수 없음(에러 발생)
  • 수정 가능
    • 하지만 변경 불가능한 자료형만 허용
    • 예를 들어 숫자, 문자열, 튜플은 집합에 저장할 수 있지만 리스트는 저장 불가

집합을 사용하는 이유

  • 중복 제거가 쉬움
    • 자동으로 중복 제거
      # 수강신청한 학생 명단 정리하기
      registration_list = ["민지", "현우", "민지", "서연", "민지", "현우"]
      actual_students = set(registration_list)
      print("실제 수강생:", actual_students)
    
      # [실행 결과]
      # 실제 수강생: {'현우', '서연', '민지'}
    
  • 수학적인 집합 연산이 가능
    • & : 두 집합의 공통된 부분을 찾는 교집합
    • | : 두 집합을 하나로 합치는 합집합
    • - : 한 집합에서 다른 집합을 빼는 차집합
  • 데이터 찾기가 빠름
    • 특정 데이터의 유무를 빠르게 확인 가능
      • in 연산자 사용
        # 출석부에서 학생 찾기
        attendance = {"민지", "현우", "서연", "지훈", "수민"}
        print("민지 있나요?", "민지" in attendance)
        print("영희 있나요?", "영희" in attendance)
      
        # [실행 결과]
        # 민지 있나요? True
        # 영희 있나요? False
      

집합 만들기

✍️ 중괄호로 직접 만들기

  • 가장 기본적인 방법
  • 중괄호{} 사용
  • 콤마로 데이터 구분
# 좋아하는 과목 집합 만들기
subjects = {"수학", "과학", "영어"}
print("좋아하는 과목:", subjects)

# 숫자 집합 만들기
numbers = {1, 2, 3, 4, 5}
print("숫자 모음:", numbers)

🛠 set() 함수로 만들기

  • set() 함수는 다른 자료형(리스트, 튜플 등)을 집합으로 변환할 때 주로 사용
  • 리스트의 중복을 제거할 때 자주 사용됨
# 리스트를 집합으로 변환하기
score_list = [85, 92, 85, 90, 88, 92]
score_set = set(score_list)
print("중복 제거된 점수:", score_set)

# 문자열을 집합으로 변환하기
text = "hello"
char_set  = set(text)
print("중복 제거된 문자들:", char_set)

🔲 빈 집합 만들기

  • 데이터 없이 비어있는 집합을 만들 땐 반드시 set() 함수 사용
  • 중괄호{} 사용 시 빈 딕셔너리가 생성되니 주의해야함
empty_set = set()
print("빈 집합:", empty_set)

# 나중에 데이터 추가하기
empty_set.add("첫번째")
empty_set.add("두번째")
print("데이터 추가 후:", empty_set)

❗ 참고 (변경 불가능한 자료형만 허용)

# 리스트같은 자료형은 집합에 저장 불가능
nvalid_set = {1, "hello", [1, 2]} # 오류! 리스트는 집합에 저장 불가

오류가 나는 이유?

  • 집합의 특성상 안정성 유지를 위함

집합 활용하기

  • 집합은 언제든지 새로운 데이터를 추가하거나 삭제할 수 있는 유연한 자료형

집합에 요소 추가하기

➕ add() 메서드

  • 집합에 요소를 추가
  • 하나의 요소만 추가
  • 집합에 해당 요소가 이미 존재한다면 자동으로 무시해 중복되는 요소가 생기지 않음
numbers = {1, 2, 3}
numbers.add(4)
print("4 추가 후:", numbers)

# 이미 있는 값을 추가하면?
numbers.add(3)  # 이미 있는 값은 무시됨
print("3 추가 시도 후:", numbers)

📥 update() 메서드

  • 한꺼번에 여러 요소를 추가할 때 주로 사용
  • 필요에 따라 리스트, 튜플, 문자열 등 다양한 자료형을 전달할 수 있고, 전달된 요소들을 한 번에 집합에 추가
fruits = {"사과", "바나나"}
fruits.update(["딸기", "포도"])
print("여러 과일 추가 후:", fruits)

집합에서 요소 제거하기

➖ remove() 메서드

  • 지정한 요소를 정확하게 찾아서 제거
  • 집합 안에 제거하려는 요소가 없으면 오류 발생
    • 실수로 잘못된 데이터를 제거하려는 시도 방지
numbers = {1, 2, 3, 4, 5}
print("처음 집합:", numbers)

# 있는 요소 제거하기
numbers.remove(3)
print("3 제거 후:", numbers)

# 없는 요소 제거 시도
numbers.remove(10)  # 오류 발생!

🚮 discard() 메서드

  • remove() 메서드와 비슷하게 동작하지만, 제거하려는 요소가 없을 때 에러가 발생하지 않음
  • 데이터의 존재 여부가 확실하지 않을 때 사용
numbers = {1, 2, 3, 4, 5}
print("처음 집합:", numbers)

# 있는 요소 제거
numbers.discard(3)
print("3 제거 후:", numbers)

# 없는 요소 제거 시도
numbers.discard(10) # 오류가 나지 않아요
print("10 제거 시도 후:", numbers)

🧹 claer() 메서드

  • 집합 내 모든 요소를 한 번에 삭제
  • 비어있는 집합이 됨
numbers = {1, 2, 3, 4, 5}
print("처음 집합:", numbers)

# 모든 요소 제거하기
numbers.clear()
print("clear() 후:", numbers)
print("집합이 비었나요?", len(numbers) == 0)

교집합, 합집합, 차집합 연산

🔗 교집합 (intersection)

  • 두 집합에서 공통으로 가지고 있는 요소들만 모음
  • 기호 : &
  • 메서드 : intersection()
  • 특징 : 양쪽 모두 있는 요소만 남음
# 두 학생의 좋아하는 과목
younghee_subjects = {"국어", "수학", "영어", "과학"}
cheolsoo_subjects = {"수학", "영어", "체육", "미술"}

# & 기호로 교집합 구하기
common_subjects = younghee_subjects & cheolsoo_subjects
print("& 기호로 구한 공통 과목:", common_subjects)

# intersection() 메서드로 교집합 구하기
common_subjects2 = younghee_subjects.intersection(cheolsoo_subjects)
print("intersection()으로 구한 공통 과목:", common_subjects2)

🌍 합집합 (union)

  • 두 집합의 모든 요소를 합친 것
  • 중복되는 요소는 자동으로 하나만 포함
  • 기호 : |
  • 메서드 : union()
  • 특징 : 중복 없이 모든 요소가 포함됨
# | 기호로 합집합 구하기
all_subjects = younghee_subjects | cheolsoo_subjects
print("| 기호로 구한 모든 과목:", all_subjects)

# union() 메서드로 합집합 구하기
all_subjects2 = younghee_subjects.union(cheolsoo_subjects)
print("union()으로 구한 모든 과목:", all_subjects2)

✂️ 차집합 (difference)

  • 한 집합에서 다른 집합의 요소를 뺀 것
  • A-B의 경우 A에는 있지만 B에는 없는 항목을 반환
  • 기호 : -
  • 메서드 : difference()
  • 특징 : 순서가 중요(A-B와 B-A는 다름)
# - 기호로 차집합 구하기
younghee_only = younghee_subjects - cheolsoo_subjects
cheolsoo_only = cheolsoo_subjects - younghee_subjects

print("영희만 좋아하는 과목:", younghee_only)
print("철수만 좋아하는 과목:", cheolsoo_only)

# difference() 메서드로 차집합 구하기
younghee_only2 = younghee_subjects.difference(cheolsoo_subjects)
print("difference()로 구한 영희만의 과목:", younghee_only2)

자료형 변환

자료형 변환의 기본

🔤 str()

  • 숫자나 리스트 등을 문자열로 바꿔 주는 함수
  • 데이터 출력을 깔끔히 처리하거나 파일에 저장할 때 유용함
  • 문자열로 변환해야 다른 문자열과 연결이 가능함
# 학생 정보 출력하기
student_id = 202301
name = "민지"
avg_score = 92.5

# 문자열로 변환하여 정보 출력하기
student_info = "학번: " + str(student_id) + ", 이름: " + name + ", 평균: " + str(avg_score)
print(student_info)

🔢 int()

  • 문자열이나 실수를 정수형으로 바꿔 주는 함수
  • 문자열이 반드시 숫자로만 구성돼 있어야 함
  • 실수의 소수점 아래는 생략됨
# 사용자 나이 계산하기
birth_year_str = "2005"
current_year = 2024

# 문자열을 정수로 변환하여 나이 계산
birth_year = int(birth_year_str)
age = current_year - birth_year
print(f"{birth_year}년생의 나이는 {age}살입니다")

# 실수를 정수로 변환할 때는 소수점 아래가 버려져요
height = 173.7
print(f"키 {height}cm를 정수로 변환하면 {int(height)}cm")

📏 float()

  • 나눗셈이나 평균 계산처럼 소수점이 필요한 연산에서 주로 사용되는 함수
# 시험 평균 계산하기
midterm = "78"
final = 84
bonus = 5

total = float(midterm) + float(final) + float(bonus)
final_average = total / 3
print(f"이번 학기 평균: {final_average:.2f}점")

리스트, 튜플, 집합 간의 변환

📜 list()

  • 집합이나 튜플을 리스트로 바꿔 주는 함수
  • 순서가 있고, 요소를 자유롭게 수정할 수 있기 때문에 데이터를 자유롭게 바꾸거나 순서를 조정하고 싶을 때 사용
# 튜플을 리스트로 변환
score_tuple = (90, 85, 95)
score_list = list(score_tuple)
print("튜플을 리스트로:", score_list)

# 집합을 리스트로 변환
fruit_set = {"사과", "바나나", "딸기"}
fruit_list = list(fruit_set)
print("집합을 리스트로:", fruit_list)

🔗 tuple()

  • 리스트나 집합을 튜플로 바꿔 주는 함수
  • 데이터 요소를 바꿀 수 없으니 데이터를 확정해두고 변경되지 않도록 고정하고 싶을 때 사용
# 리스트를 튜플로 변환
name_list = ["민지", "하준", "서연"]
name_tuple = tuple(name_list)
print("리스트를 튜플로:", name_tuple)

# 집합을 튜플로 변환
name_set = {"민지", "하준", "서연"}
name_tuple = tuple(name_list)
print("집합을 튜플로:", name_tuple)

🧺 set()

  • 리스트나 튜플을 집합으로 바꿔 주는 함수
  • 중복을 제거하거나, 여러 데이터에서 교집합·차집합 등을 찾아낼 때 유용
  • 순서가 없으므로 순서가 중요치 않은 데이터를 처리할 때 좋음
# 리스트를 집합으로 변환 (중복 제거 효과!)
num_list = [1, 2, 2, 3, 3, 3]
num_set = set(num_list)
print("중복 있는 리스트를 집합으로:", num_set)

# 튜플을 집합으로 변환 (중복 제거 효과!)
num_tuple = (1, 2, 2, 3, 3, 3)
num_set = set(num_tuple)
print("중복 있는 튜플를 집합으로:", num_set)

출처
데이스쿨 - 나도 할 수 있다! 파이썬: 하

Leave a comment