5. 고급 자료형 II > 5-5. 집합이란?

집합이란?

이번에는 이름부터 친숙한 집합 자료형에 대해 배워보겠습니다. 자주 사용되는 자료형은 아니기에 쉬어간다 생각하고 보셔도 좋습니다.

집합 생성

딕셔너리 파트에서 언급했듯, 집합도 중괄호{}를 사용합니다. 그러나 집합의 경우 중괄호는 생성이 아닌 형태를 잡아주는 것에 불과합니다. 집합의 생성은 중괄호가 아닌 set 키워드를 통해 이뤄집니다. set() 함수 안에 리스트의 형태로 집합 내부 값들을 넣어 생성되는 방식입니다. 말로 하니 너무 복잡하네요. 코드를 살펴볼까요?

a = set([1,2,3])
print(a) #집합 {1,2,3}이 출력됩니다.

만약 리스트의 형태가 아닌 값들을 넣는다면 어떤 결과가 나올까요?

b = set(1,2,3) #TypeError: set expected at most 1 arguments, got 3

역시 에러가 발생합니다. 에러 메시지는 해석해보면, 집합 생성시 최대 1개의 인수만 받을 수 있는데 3개를 넣어 에러가 났다는 의미입니다.

b = set(1) #TypeError: 'int' object is not iterable

이번엔 인수를 하나만 넣었는데도 에러가 발생합니다. 그런데 에러 메시지가 다릅니다. 인수가 정수형으로, iterable 하지 않다는 이유인데요. iterable을 간단히 설명하자면, 자신이 가진 값들을 차례로 반환가능한 객체를 의미합니다. 대표적으로 리스트, 문자형, 튜플이 있어요. 너무 깊이 고민할 필요는 없답니다!

b = set("hello")
print(b) #{'o', 'l', 'e', 'h'}

iterable한 문자형을 하나 넣어봤더니 이번엔 집합이 생성되었습니다!

집합의 특징

앞서 문자형을 넣어 생성된 집합의 출력 결과가 조금 이상하지 않나요? 순서도 뒤죽박죽이고 소문자 L도 하나 없죠. 사실 이건 집합의 대표적 특징이랍니다. 집합은 아래와 같은 특징을 갖습니다.

  • 중복을 허용하지 않는다.
    • 앞선 예시에서는 소문자 L이 두개였기에 하나가 생략된 것이죠.
  • 순서가 없다.
    • o, l, e, h라는 이상한 출력 결과가 이해되시죠?
  • 인덱싱이 불가능하다.
    • 인덱싱을 위해서는 순서가 있어 위치가 정해져 있거나, 딕셔너리처럼 각 값에 대응하는 Key가 있거나 둘 중 하나의 조건을 충족해야 하는데 집합은 두 조건 모두 충족하지 못하죠. 당연히 인덱싱은 불가능합니다.

집합의 활용

혹시 함수 관련 내용을 까먹으신 분들은 본 링크를 통해 짧게 공부하고 오기! 생성부터 특징까지 쉽지 않은 놈이군... 하는 생각이 드실 것 같아요. 꽤나 까다로운 자료형이죠. 그래서 얘를 어디에 쓰는데! 질문하시면, 아래와 같이 활용이 가능하답니다.

교집합

집합 간 겹치는 부분을 의미하죠. 교집합 부분 원소를 반환합니다. 교집합 연산자 &intersection() 함수를 통해 연산 가능합니다.

a & b
a.interaction(b)

합집합

두 집합의 원소를 합치는 것을 의미하죠. 두 집합의 전체 원소를 중복없이 반환합니다. 합집합 연산자 |union() 함수를 통해 연산 가능합니다.

a | b
a.union(b)

차집합

특정 집합에서 다른 집합과 겹치는 부분을 제외하는 것을 의미하죠. 특정 집합에서 다른 집합과의 교집합 원소를 제외한 부분의 원소만을 반환합니다. 차집합 연산자 -difference() 함수를 통해 연산 가능합니다.

a - b
a.difference(b)

집합과 관련된 함수

add() - 원소 하나 추가하기

리스트의 append() 함수가 생각나는 함수죠?

b.add(4)

update() - 원소 여러개 추가하기

앞선 add() 함수는 원소를 하나 추가하기 때문에 리스트 형식을 사용할 필요가 없었지만, update() 함수는 다수의 원소를 추가하는 함수기에 리스트 사용은 필수입니다.

b.update([5,6,7])

remove() - 특정 원소 제거하기

b.remove(6)
마지막으로 업데이트 된 날짜:
2022년 9월 24일