Python 기초(3)

백동윤·2025년 11월 20일

Python

목록 보기
3/17
post-thumbnail

Tuple

  • 여러 개의 값을 하나의 변수에 저장할 수 있는 자료형

  • 순서가 유지되며, 변경이 불가능(immutable)한 시퀀스 타입

  • 불변성(immutable), 순서유지, 중복허용

  • 단일 요소인 튜플을 만들 때는, 쉼표(,)를 꼭 붙여야 튜플로 인식한다.

  • unpacking: 시퀀스에 저장된 여러 값을 여러 변수에 한 번에 나누어 저장하는 문법

-------------튜플생성---------------
my_tuple = (1, 2, 3, 4)
print(my_tuple) # 1, 2, 3, 4
print(type(my_tuple)) # <class 'tuple'>

my_tuple2 = (5, 6, 7, 8)
print(type(my_tuple2)) # <class 'tuple'>

단일 요소 튜플 생성

single_ele_tuple = (100,)

튜플 생성 함수로 생성

my_tuple2 = tuple()
print(my_tuple2)

my_tuple3 = tuple("codingon")
print(my_tuple3)

언패킹

  • 시퀀스에 저장된 여러 값을 여러 변수에 나눠 저장하는 것
  • 튜플, 리스트, 문자열...
apple, banana, kiwi = ("apple", "banana", "kiwi")
print(apple, banana, kiwi)

불변성(immutable)

-객체가 생성된 이후 내부 데이터를 변경할 수 없는 것

my_tuple[0] = 100 # TypeError: 'tuple' object does not support item assignment

튜플의 삭제

del my_tuple[1] # TypeError: 'tuple' object doesn't support item deletion
  • 튜플 자체는 삭제가 가능하지만 원소 삭제는 불가하다.
del my_tuple
print(my_tuple) # NameError: name 'my_tuple' is not defined

indexing, slicing

  • 다른 시퀀스 자료형(문자열, 리스트)과 동일하게 사용가능함

튜플이 불변성을 가지는 이유

  • 데이터 보호, 성능 최적화, 키(key)사용가능

튜플 수정

my_tuple4 = (10, 20, 30)
new_tuple = (100,) + my_tuple4[1:]
print("원본 튜플", my_tuple4)
print("새로운 튜플", new_tuple)

# 실습 1. 고객 데이터 복구(?)작전

# step1. 손상된 고객 정보 복원하기
unknown = ("minji", 25, "Seoul")
user = ("eunji",) + unknown[1:]
restored_user = user
print("Restored User", restored_user)

결과

# step2. 고객 정보 언패킹하여 변수에 저장
name, age, city = restored_user
print(name, age, city)

결과

# step 3. 지역별 보안 정책 분기 처리
city = input("거주 지역을 입력하세요: ")
if city.lower() == "seoul": # 대소문자 구분없이 비교 가능
    print("서울 지역 보안 정책 적용 대상입니다.")
else :
    print("일반 지역 보안 정책 적용 대상입니다.")

결과

# step 4. 고객 데이터 통계 분석
users = ("minji", "eunji", "soojin", "minji", "minji")
print(users.count("minji"))
print(users.index("soojin"))

결과

# step 5. 고객 이름 정렬
sorted_users = sorted(users)
print("Customers Name", sorted_users)

결과

set(집합)

  • 중복을 허용하지 않고, 순서가 없는 컬렉션 자료형

set 만들기

s1 = {1, 2, 3}
print(s1, type(s1))

s2 = {1, 1, 1, 11, 2, 2, 2, 2,2 ,22, 3, 3, 4, 5, 6, 754 ,23432, 4}
print(s2) # {1, 2, 3, 4, 5, 6, 23432, 11, 754, 22}
빈 set 만들기
  • 중괄호에 원소를 넣지 않고 만들면 빈 dict로 인식이 된다.
s3 = {}
print(type(s3)) # <class 'dict'>
set 함수 생성
s4 = set()
print(s4, type(s4)) # set() <class 'set'>

set함수의 활용: 원소의 중복 제거

my_list = [1, 1, 12, 3, 4, 3, 4, 5, 6, 4, 3, 354532 ]
s5 = set(my_list)
print(s5) # {1, 3, 4, 5, 6, 354532, 12}

인덱싱, 슬라이싱 사용불가

s1[1] # TypeError: 'set' object is not subscriptable

set의 기본 문법

s = {'apple', 'banana', 'cherry'}
for fruit in s:
    print(fruit)
  • 순서가 없지만 for 등과 같은 반복문 가능
  • 출력 순서는 예측 불가(내부적으로 해시값 기반 저장)
ss = {1, 2, (3, 4)}
ss = {[1, 2]} # TypeError: unhashable type: 'list'
  • set의 원소는 변경 불가능한(immutable) 객체여야 함
  • 리스트나 딕셔너리처럼 mutable한 객체는 원소로 쓸 수 없다.

자료형의 제한

  • 가변(mutable) 자료형은 원소로 사용할 수 없다.
    s1 = {1, 2, 4, [3, 5, 6]}

set 연산

  • 집합의 연산: 합집합, 교집합, 차집합, 대칭차집합
a = {1, 2, 3}
b = {3, 4, 5}
합집합(| 또는 .union)
s_union1 = a | b
s_union2 = a.union(b)
print("합집합1", s_union1)
print("합집합2", s_union2)
교집합(& 또는 .intersection)
s_inter1 = a & b
s_inter2 = a.intersection(b)
print("교집합1", s_inter1)
print("교집합2", s_inter2)
차집합(- 또는 difference) <-- 순서가 바뀌면 결과가 바뀜
s_diff1 = a - b
s_diff2 = a.difference(b)
print("차집합1", s_diff1)
print("차집합2", s_diff2)
대칭 차집합(^ 또는 symmetric_difference)
s_sym1 = a ^ b
s_sym2 = a.symmetric_difference(b)
print("대칭차집합1", s_sym1)
print("대칭차집합2", s_sym2)
# 실습 1-1. 중복 제거 및 개수 세기

submissions = ['kim', 'lee', 'kim', 'park', 'choi', 'lee', 'lee']
students = set(submissions)
print(len(students)
print(students)

결과

#실습 1-2. 공통 관심사 찾기

user1 = {'SF', 'Action', 'Drama'}
user2 = {'Drama', 'Romance', 'Action'}
set1 = user1 & user2
set2 = user1 ^ user2
set3 = user1 | user2
print("공통 관심 장르: ", set1)
print("서로 다른 장르: ", set2)
print("전체 장르: ", set3)

결과

set 메서드

s1 = {1, 2, 3}
원소 추가
s1.add(4)
print("원소 추가", s1)
여러 원소 추가
s1.update({5, 6, 7})
print("여러 원소 추가", s1)
원소 제거
s1.remove(4)
print("원소 제거1", s1)
# s1.remove(100) # KeyError: 100 <-- 존재하지 않는 원소 삭제 시도시 에러발생

s1.discard(100) # 해당 요소 제거(없으면 무시함)
s1.discard(6)
print("원소 제거2", s1)

deleted = s1.pop() # 임의의 요소 제거 후 반환
print("원소 제거3", s1, deleted)

부분 집합(subset) 관련 메서드

a = {10, 20, 30, 40, 50} # 상위집합
b = {20, 30, 40} # 부분집합
c = {10, 200, 300, 400, 500}
부분집합 여부 판단
print(b.issubset(a)) # True
print(a.issubset(b)) # False
상위집합 여부 판단
print(a.issuperset(b)) # True
print(b.issuperset(a)) # False
공통 원소 유무 확인
print(a.isdisjoint(b)) # False <-- 공통원소가 있으면 False 출력!
print(a.isdisjoint(c)) # False
print(b.isdisjoint(c)) # True <-- 공통원소가 없어서!
# 실습 1-3. 부분집합 관계 판단
my_certificates= {'SQL', 'Python', 'Linux'}
job_required= {'SQL', 'Python'}
set4 = my_certificates & job_required
print("지원 자격 충족 여부: ", my_certificates.issuperset(job_required))

결과

profile
동윤2입니다.

0개의 댓글