여러 개의 값을 하나의 변수에 저장할 수 있는 자료형
순서가 유지되며, 변경이 불가능(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)
-객체가 생성된 이후 내부 데이터를 변경할 수 없는 것
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
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)
결과

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}
s3 = {}
print(type(s3)) # <class 'dict'>
s4 = set()
print(s4, type(s4)) # set() <class '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
s = {'apple', 'banana', 'cherry'}
for fruit in s:
print(fruit)
ss = {1, 2, (3, 4)}
ss = {[1, 2]} # TypeError: unhashable type: 'list'
s1 = {1, 2, 4, [3, 5, 6]}a = {1, 2, 3}
b = {3, 4, 5}
s_union1 = a | b
s_union2 = a.union(b)
print("합집합1", s_union1)
print("합집합2", s_union2)
s_inter1 = a & b
s_inter2 = a.intersection(b)
print("교집합1", s_inter1)
print("교집합2", s_inter2)
s_diff1 = a - b
s_diff2 = a.difference(b)
print("차집합1", s_diff1)
print("차집합2", s_diff2)
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)
결과

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)
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))
결과
