
# 모두의 연구소, 토요일 스터디 Jump to Python - 2nd, 발표 : Eunseon Jo

# 4.6 자료형 : 집합(Sets)

# set 집합은 보통 집합에 관련된 것들을 쉽게 처리하기 위해 만들어진 자료형(데이터타입)입니다.
# set 자료형은 다음과 같이 set 키워드를 이용하여 만들 수 있습니다.
# set 연산은 두 단어에서 중복문자를 제외한 유일한 문자만을 뽑아냅니다.
# set 함수는 중괄호 '{}'에 구성요소를 넣어 만들거나 또는 내장함수 set(iterable) 명령을 이용하여 만들 수 있습니다.
# 단, 비어있는 set 생성시 {}로는 만들 수 없고, set()함수를 사용합니다.
# set() 안에는 리스트, 문자열, 튜플, 딕셔너리 등이 올 수 있습니다.

s = {}
s = set() # 빈집합
s = {0,1,2,3} # {element_1, element_2, element_3, ... }
s = set((0, 1, 2, 3)) # 튜플을 이용한 집합
s = set([0, 1, 2, 3]) # 리스트를 이용한 집합
s = set(range(2)) # 반복을 이용한 집합

# set의 특징은 다음과 같습니다.
# 1) 중복되지 않아 집합에 넣은 유일한 1가지 원소 항목만 만들어내는 집합입니다.
# 2) 순서대로 추출되지 않아 인덱스(index)를 사용한 연산을 할 수 없습니다.
# 3) 구성원 확인 또는 중복 원소를 제거할 때 사용합니다.

#4.6.1 set

# 집합의 연산으로 합집합(∪), 교집합(∩), 차집합 등 다양한 연산을 지원합니다.

# 예제1)

s1 = set([10, 20, 30, 40])
print(s1)
# 완료: {40, 10, 20, 30}

# 예제2) 리스트 입력
s2 = set("START")
print(s2)

# 완료: {'R', 'S', 'T', 'A'}
# 한 단어씩 {'', ''}안에 추출되며, 중복 알파벳인 경우 한 번만 추출된다.
# 즉, set의 특징은 중복을 허용하지 않으며, 순서가 없습니다(unordered)

# 리스트나 튜플은 순서가 있기(ordered)때문에 인덱싱을 통해 자료형의 값을 받을 수 있습니다.
# 하지만, set 자료형은 순서(unordered)가 없기 때문에 인덱싱으로 값을 얻을 수 없습니다.
# 같이 인덱싱을 지원하지 않는 자료형으로는 딕셔너리가 있습니다.
# set자료형에서 저장된 값을 인덱싱으로 접근하려면 다음과 같이 리스트나 터플로 변환한 후 가능합니다.

s3 = set([50, 60, 70])
l1 = list(s3) # 확인 필요
print(l1[0])

# 4.6.2 교집합

#set 자료형이 정말 유용하게 사용되는 경우는 다음과 같이 교집합, 합집합, 차집합을 구하려 할 때입니다.

# 예시1) 아래 두개의 set 자료형을 만들어보기

s4 = set([10,20,30,40,50,60])
s5 = set([40,50,60,70,80,90])
# 완료: {40, 50, 60}
# s4는 10부터 60까지의 값을 갖고, s5는 40부터 90까지의 값을 가지게 됩니다.

# 실습1 : &기호를 이용하여 자료형의 교집합 구하기

print(s4 & s5)
# 완료: {40, 50, 60}

# 예시2) .intersection() 함수 사용해보기
print(s4.intersection(s5))
# 완료: {40, 50, 60}

# 4.6.3 합집합
# 실습2 : 합집합 만들어보기
print(s4 | s5)
# 완료: {70, 40, 10, 80, 50, 20, 90, 60, 30}

# 예시3) union 함수 이용해서 합집합 만들기
print(s4.union(s5))
# 완료: {70, 40, 10, 80, 50, 20, 90, 60, 30}

# 4.6.4 차집합
# 실습3 : 차집합 - 기호 이용해서 만들기
print(s4 - s5)
# 완료: {10, 20, 30}

# 예제4) 차집합 difference 함수 이용하기
print(s4.difference(s5))
# 완료: {10, 20, 30}

# 4.6.5 추가와 삭제
# 한번 만들어진 set 자료형에 값을 추가할 수 있습니다.
# 실습4: 한 개의 값만 추가할 경우 .add() 함수

s6 = set([100,200,300])
s6.add(400)
print(s6)
# 완료: {200, 100, 400, 300}

# 예제5) 여러개의 값을 한번에 추가(update)할 경우
s7 = set([100,200,300])
s7.update([400,500,600])
print(s7)

# 완료: {100, 200, 300, 400, 500, 600}

# 삭제
s8 = set([700,800,900])
s8.remove(800)
print(s8)

# 완료: {900, 700}

# 4.6.5 추가와 삭제
# 한번 만들어진 set 자료형에 값을 추가할 수 있습니다.
# 실습4: 한 개의 값만 추가할 경우 .add() 함수

# 4.6.6 (A∪B) - (A∩B)

s9 = set([100,200,300,400,500])
s10 = set([200,400,600,800])
print(s9 ^ s10)
print(s9.symmetric_difference(s10))

# 다음은 4.7 참과 거짓(True/False)으로 이동해주세요 :D
# practice4-7_.py
