본문 바로가기
Python/Basic

[파이썬, Python] 자료구조(Data Structure) - 4️⃣ 세트(set)

by coding-choonsik 2023. 3. 8.
728x90
반응형
SMALL

1. 세트(set)

  • 수학의 집합과 비슷한 형태로 순서가 없어서 어떤 값이 먼저 나올지 알 수 없고, 중복되는 데이터를 허용하지 않음.
  • 딕셔너리처럼 중괄호를 사용해서 선언하지만, key는 존재하지 않고 value만 존재

1-1. set 만들기

  • {값1, 값2, ...}
  • set()
set1 ={}    
print(set1)
>>> {}
print(type(set1))
>>> <class 'dict'>   # 빈 중괄호는 dict로 만듬
set1 = {1, 3, 5, 7}   
print(set1)
>>> {1, 3, 5, 7}
print(type(set1))
>>> <class 'set'> # 값을 넣어주면 set이 됨
set3 = {1, 3, 5, 3, 7, 9, 1}
print(set3)    
>>> {1, 3, 5, 7, 9}  # 중복데이터 허용하지 않음

li1 = [1, 3, 5, 7]
set2 = set(li1)
print(set2)
>>> {1, 3, 5, 7}
print(type(set2))
>>> <class 'set'>
li2 = [1, 3, 5, 3, 7, 9, 1]
print(li2)
>>> [1, 3, 5, 3, 7, 9, 1] # 리스트는 데이터의 중복 허용

set4 = set(li2)   
print(set4)
>>> {1, 3, 5, 7, 9}  # 리스트에서 중복된 데이터를 제거하고 unique한 값을 알 수 있음

  • set에서 요소가 있는지 in을 통해 알아보자.
set4 = {1, 3, 5, 7, 9}

print(3 in set4)  
>>> True
print(8 in set4) 
>>> False
print(8 not in set4)   
>>> True        # False의 반대

2. set의 함수

2-1. add()

  • set에 단일 데이터를 추가
  • inplace 연산
set5 = {100,200}
set5.add(150)
print(set5)   
>>> {200, 100, 150}       # inplace연산이 됨

set5.add(50)
print(set5)   
>>> {200, 50, 100, 150}   # 순서가 일정하지 않음

2-2. update()

    • set에 여러 데이터를 한번에 추가
    • 여러 데이터를 한번에 넣을 때는 대괄호로 감쌈
set6 = {10, 20, 30}
set6.update([40, 50, 60, 20])   
print(set6)   
>>> {40, 10, 50, 20, 60, 30}     # 중복된 데이터를 넣어도 중복을 허용하지 않음

2-3. remove()

  • set의 데이터를 제거
  • 제거할 데이터가 없으면 에러
  • inplace 연산
set6 = {40, 10, 50, 20, 60, 30}
set6.remove(50)   
print(set6)
>>> {40, 10, 20, 60, 30}  # inplace연산


# 없는 데이터를 제거하면 에러
set6.remove(50)     # KeyError: 50
print(set6)
>>> KeyError: 50

2-4. discard()

  •  set의 데이터를 제거
  • 제거할 데이터가 없어도 에러가 발생하지 않음
set6.discard(30)
print(set6)
>>> {40, 10, 20, 60}

# 없는 데이터를 제거해도 에러나지 않음
set6.discard(30)
print(set6)
>>> {40, 10, 20, 60}

2-5. copy()

  • set을 복사
  • 다른 메모리 주소를 가짐
  • id(): 저장된 메모리 주소를 10진수로 표현, 주소값을 비교할 때 사용
# 대입 연산자를 사용 했을 때 주소값
li1 = [1,2,3,4]
li2 = li1
print(id(li1))
>>> 139812090014080
print(id(li2))
>>> 139812090014080  # 주소값 동일
set7 = {10, 20, 30}
set8 = set7.copy()
print(set7)
>>> {10, 20, 30}
print(set8)
>>> {10, 20, 30}

print(id(set7))
>>> 139812090366432    
print(id(set8))
>>> 139812090367776     # 주소값 다름

3. set의 연산자

3-1. 합집합

  • 여러 set의 데이터를 합침
  • 중복 허용 하지 않음
  • |, union()
s1 = {10, 20, 30, 40, 50}
s2 = {30, 40, 50, 60, 70}

result = s1 | s2
print(result)
>>> {70, 40, 10, 50, 20, 60, 30}

result =  s1.union(s2)
print(result)
>>> {70, 40, 10, 50, 20, 60, 30}

3-2. 교집합

  • 여러 set 중 동일한 요소만 반환
  • &, intersection()
s1 = {10, 20, 30, 40, 50}
s2 = {30, 40, 50, 60, 70}

result = s1 & s2
print(result)
>>> {40, 50, 30}
result = s1.intersection(s2)
print(result)
>>> {40, 50, 30}

3-3. 차집합

  • s1에 포함되지만 s2에는 포함되지 않은 s1의 요소들만 반환
  • -, difference()
s1 = {10, 20, 30, 40, 50}
s2 = {30, 40, 50, 60, 70}

result = s1 - s2
print(result)
>>> {10, 20}
result = s1.difference(s2)
print(result)
>>> {10, 20}

3-4. 대칭 차집합

  • s1과 s2의 교집합 요소를 제외한 요소들을 반환
  • ^, symmestric_differences
s1 = {10, 20, 30, 40, 50}
s2 = {30, 40, 50, 60, 70}

result = s1 ^ s2
print(result)
>>> {20, 70, 10, 60}
result = s1.symmetric_difference(s2)
print(result)
>>> {20, 70, 10, 60}

4. set과 zip()함수

string = 'apple'
li = [1,2,3,4,5]
tu = ['김사과', '반하나', '오렌지', '이메론', '채애리']

print(zip(string, li, tu))    
>>> <zip object at 0x7f28bf87af00>     # zip객체가 만들어짐

# 각 요소들을 묶어 리스트로 반환
print(list(zip(string, li, tu)))
>>> [('a', 1, '김사과'), ('p', 2, '반하나'), ('p', 3, '오렌지'), ('l', 4, '이메론'), ('e', 5, '채애리')]
# zip함수로 각 요소들을 묶어 set형식으로 반환
print(set(zip(string, li, tu)))
>>> {('a', 1, '김사과'), ('p', 3, '오렌지'), ('l', 4, '이메론'), ('e', 5, '채애리'), ('p', 2, '반하나')}
# 딕셔너리 구조는 key와 value 두가지 요소일 때만 만들수 있음
print(dict(zip(li, tu)))
>>> {1: '김사과', 2: '반하나', 3: '오렌지', 4: '이메론', 5: '채애리'}

# dict의 key는 중복을 허용하지 않기 때문에 하나의 데이터만 남음
# set은 순서가 없기 때문에 어떤 데이터가 남을지 알 수 없음
print(dict(zip(string, tu)))
>>> {'a': '김사과', 'p': '오렌지', 'l': '이메론', 'e': '채애리'}

 

728x90
반응형
LIST