# 튜플 tuple
# 리스트 자료구조와 유사하지만
# 한번 입력한 자료는 변경불가
# 즉, 요소 추가는 가능/수정, 삭제는 불가
# 튜플은 ()을 이용해서
# 튜플생성시 단일 요소는 요소 뒤에 , 를 추가

t = [ 1, 2, 3 ]     # 리스트
t = ( 1, 2, 3 )
t = (1, 'a', True )
t = (1)             # 숫자
t = (1,)            # 단일요소로 구성된 튜플

days = ( '일', '월', '화', '수', '목', '금', '토' )
print( days )       # 요일을 튜플로 정의하고 출력

print( days[ 3 ] )       # '수'요일 출력
print( len( days ) )
print( days[ 3 : ] )    # 슬라이스

# days[3] = '水'           # 튜플요소에 값 변경 - 불가!


# 집합set
# 저장된 데이터를 순서에 따라 관리 하지 않고
# 중복을 허용하지 않는 (unique) 자료구조
# 집합은 {}을 이용
# 집합의 개념에 따라 합/교/차집합 등의 연산 지원

t = [ 1, 1, 1, 1 ]
print(t)
t = ( 1, 1, 1, 1 )
print(t)
t = { 1, 1, 1, 1 }
print(t)

t = [ 1, 1, 1, 3, 4, 5, 6, 7, 3, 3, 2, 5, 7, 8, 9 ]
print(t)
t = set( t )        # 리스트를 집합으로 변환
print(t)

# 집합 정의
# 1월 중 교육받는 날을 집합으로 정의
edu = {  1, 2, 3, 4, 5, 8, 9, 10, 11, 12 }

# 집합의 기본적인 연산
동물 = { '사자', '늑대', '호랑이', '얼룩말' }
육상동물 = { '고릴라', '표범', '울버린', '아나콘다', '퓨마', '재규어', }
해상동물 = { '나일악어', '뱀상어', '인도악어', '백상아리', '흑범고래', '민부리고래' }
조류 = { '앵무새', '벌새', '올빼미', '펭귄', '두루미'}

print( len( 동물 ) )        # 길이
print( '울버린' in 육상동물 )        # 울버린 검색 : in 연산자
print( '울버린' in 조류 )        # 울버린 검색 : in 연산자
# print( 동물[2] )            # 인덱스 연산 : 3번째 동물은?

print( 육상동물.union( 해상동물 ) )      # 합집합
print( 육상동물 | 해상동물 )       # 합집합
새로운동물 = 육상동물 | 해상동물
print( 새로운동물.intersection( 육상동물 ) )     # 교집합
print( 새로운동물.intersection( 해상동물 ) )     # 교집합
print( 새로운동물 & 육상동물 )     # 교집합

print( 새로운동물.difference( 육상동물 ) )     # 차집합
print( 새로운동물.difference( 해상동물 ) )     # 차집합
print( 새로운동물 - 해상동물 )     # 차집합

print( 새로운동물.symmetric_difference( 해상동물 ) )     # 대칭차집합
print( 새로운동물.symmetric_difference( 육상동물 ) )     # 대칭차집합
print( 새로운동물 ^ 육상동물 )     # 대칭차집합

# 집합에서 제공하는 메서드
동물.add( '인간' )      # 데이터 추가
print( 동물 )

동물.discard( '인간' )  # 데이터 제거
print( 동물 )

해상동물.remove( '인도악어' )   # 데이터 제거
print( 해상동물 )

print( 육상동물.pop() )      # 데이터 확인후 제거
print( 육상동물 )

동물.clear()      # 데이터 모두 제거
print( 동물 )


# 패킹, 언패킹
# 패킹packing : 여러 데이터를 변수 하나에 묶어 담기
# 언패킹unpacking : 변수 담긴 데이터를 여러 변수에 풀어 놓기

numbers = ( 1, 2, 3, 4, 5 )         # 튜플 생성 (packing)
a, b, c, d, e = numbers             # 튜플에 저장된 데이터를 언패킹
print( c )

numbers = 1, 2, 3, 4, 5             # 패킹시 () 생략 가능

# x ,y, z = numbers                   # 언패킹시 데이터 수와 변수갯수 일치

x ,y, *z = numbers                   # 언패킹시 변수갯수 불일치시 처리방법
print(z)

# n, k, e, m = input().split()

a, b, c = 1, 2, 3       # 변수 초기화에 패킹, 언패킹 사용