본문 바로가기
Python

[Python] 집합 (set) 자료형 사용법 및 예제

by A6K 2022. 11. 3.

파이썬 2.3부터 '집합(set)' 자료형이 지원되기 시작했다. set은 집합과 관련된 연산들을 쉽게 처리하기 위해 제공하는 자료형이다. 특히 파이썬 프로그램에서 중복된 값을 제거하기 위해서 많이 사용한다.

집합에 포함되는 엘리먼트는 순서가 없다. 따라서 집합에 추가되는 순서는 보존되지 않는다. 또 한, 동일한 값의 엘리먼트는 집합 내에 단 하나만 존재할 수 있다. 같은 값을 갖는 여러개의 엘리먼트를 집합에 추가하더라도 하나의 값만 남아있게 된다.

집합(set) 생성

파이썬에서 집합은 set() 함수를 호출하거나 중괄호를 이용해 생성할 수 있다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
print(type(fruits))

vehicle = set(['car', 'train'])
print(type(vehicle))

# <class 'set'>
# <class 'set'>

집합을 생성하기 위해 중괄호를 이용해서 집합에 포함할 엘리먼트들을 콤마로 구분해서 나열할 수 있다. 혹은 set() 함수를 이용할 수도 있는데, set() 함수의 인자로 대괄호나 중괄호로 감싸진 엘리먼트들을 넘기면 집합이 생성된다.

set() 함수만 호출하면 빈 집합이 생성된다.

집합 값 추가 - add()

이미 생성된 집합에 값을 추가하기 위해서 add() 메소드를 사용하면 된다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
fruits.add('orange')
fruits.add('mango')

print(fruits)

# {'strawberry', 'apple', 'orange', 'banana', 'mango', 'pear', 'cherry'}

엘리먼트가 추가되는 순서와 집합에서 출력되는 순서 사이에 상관관계가 없음을 주목하면 된다. 'orange'와 'mango'는 나중에 추가했지만 리스트와 다르게 엘리먼트가 중간에 섞여 있다.

중복된 값을 여러번 추가하더라도 동일한 값은 하나만 포함된다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
fruits.add('banana')
fruits.add('banana')

print(fruits)

# {'apple', 'strawberry', 'pear', 'banana', 'cherry'}

banana를 여러번 추가했지만 하나의 banana만 엘리먼트로 포함되어 있음을 확인할 수 있다.

집합 값 여러개 추가 - update()

여러 개의 값을 한꺼번에 추가할 수도 있다. 여러개의 값을 집합에 한꺼번에 추가하기 위해서는 update() 메소드를 사용한다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
new_fruits = {'cherry', 'orange', 'mango'}

fruits.update(new_fruits)

print(fruits)

# {'mango', 'orange', 'apple', 'pear', 'cherry', 'strawberry', 'banana'}

리스트로부터 값을 추가할 수도 있다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
new_fruits = ['cherry', 'orange', 'mango']

fruits.update(new_fruits)

print(fruits)

# {'banana', 'orange', 'apple', 'mango', 'cherry', 'strawberry', 'pear'}

집합 값 제거 - remove()

집합에서 특정 값을 제거하고 싶은 경우 remove() 메소드를 사용하면 된다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
fruits.remove('banana')

print(fruits)

# {'apple', 'pear', 'cherry', 'strawberry'}

만약 제거하려는 값이 집합에 없는 경우라면 KeyError가 발생한다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
fruits.remove('mango')

# Traceback (most recent call last):
#   File "./test.py", line 4, in <module>
#     fruits.remove('mango')
# KeyError: 'mango'

집합 값 안전제거 - discard()

만약 집합에 있는 값을 제거하되 값이 없으면 아무것도 하지 않기를 원하면 discard() 메소드를 사용하면 된다. remove()에서 에러가 발생했던 예제를 discard() 메소드로 바꾸어 실행해보면

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
fruits.discard('mango')

print(fruits)

# {'strawberry', 'cherry', 'pear', 'banana', 'apple'}

에러가 발생하지 않고 아무 엘리먼트도 삭제되지 않음을 확인할 수 있다. 값이 존재한다면 삭제된다.

집합 값 중 하나 가져오고 삭제 - pop()

집합에 들어있는 값 중 하나를 가져온 후 집합에서 제거하기 위해서 pop() 메소드를 사용할 수 있다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
print(fruits)
fruit = fruits.pop()
print(fruit)
print(fruits)

fruit = fruits.pop()
print(fruit)
print(fruits)

fruit = fruits.pop()
print(fruit)
print(fruits)

# {'pear', 'strawberry', 'apple', 'cherry', 'banana'}
# pear
# {'strawberry', 'apple', 'cherry', 'banana'}
# strawberry
# {'apple', 'cherry', 'banana'}
# apple
# {'cherry', 'banana'}

pop() 메소드를 호출할 때마다 임의로 섞여 있는 집합의 순서에서 앞쪽에 엘리먼트가 하나씩 뽑아져 나오고 삭제되는 것을 볼 수 있다. 주의할 점은 set 타입은 엘리먼트의 순서가 없다. 따라서 앞쪽의 엘리먼트가 뽑아져 나오지만 그 순서가 동일한 코드를 실행할 때마다 보장되지는 않는다.

만약 비어있는 집합에서 pop() 메소드를 호출한 경우 TypeError가 발생한다.

fruits = {}
fruits.pop()

# Traceback (most recent call last):
#   File "./test.py", line 4, in <module>
#     fruits.pop()
# TypeError: pop expected at least 1 argument, got 0

 

집합 엘리먼트 개수 확인 - len()

빈 집합에서 pop() 메소드를 호출하면 TypeError가 발생한다. 따라서 pop() 메소드를 호출하기 전에 집합이 비어있는지 확인해야한다. 파이썬에서는 len() 함수의 인자로 집합을 넘기면 집합에 포함되어 있는 엘리먼트 개수를 알 수 있다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
count = len(fruits)
print(count)

# 5

집합 초기화 - clear()

집합의 clear() 메소드를 호출하면 집합을 빈 집합으로 만들어버린다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}
fruits.clear()

print(fruits)

# set()

빈 집합은 'set()'으로 표기된다. 

집합에 특정 엘리먼트가 있는지 확인 - in, not in

집합에 특정 값을 갖는 엘리먼트가 포함되어 있는지를 확인하기 위해 in 연산이나 not in 연산을 사용할 수 있다.

fruits = {'apple', 'banana', 'pear', 'strawberry', 'cherry'}

if 'apple' in fruits:
  print ('apple은 포함')
  
if 'mango' in fruits:
  print ('mango는 포함')
  
if 'orange' not in fruits:
  print ('orange는 포함되어 있지 않음')
  
# apple은 포함
# orange는 포함되어 있지 않음

교집합 -  &, intersection()

두 집합의 교집합을 구하기 위해서는 '&' 기호를 이용하거나 intersection() 메소드를 이용하면 된다.

my_fruits = {'apple', 'banana', 'pear', 'strawberry'}
your_fruits = {'cherry', 'banana', 'strawberry', 'mango'}

print (my_fruits & your_fruits)
print (my_fruits.intersection(your_fruits))
print (your_fruits.intersection(my_fruits))

# {'banana', 'strawberry'}
# {'banana', 'strawberry'}
# {'banana', 'strawberry'}

참고로 교집합을 구하는 연산은 인자의 순서가 바뀌어도 동일한 결과를 리턴한다. 

합집합 - |, union()

두 집합의 합집합을 구하기 위해서는 '|' 기호를 이용하거나 union() 메소드를 이용하면 된다.

my_fruits = {'apple', 'banana', 'pear', 'strawberry'}
your_fruits = {'cherry', 'banana', 'strawberry', 'mango'}

print (my_fruits | your_fruits)
print (my_fruits.union(your_fruits))
print (your_fruits.union(my_fruits))

# {'mango', 'apple', 'banana', 'cherry', 'strawberry', 'pear'}
# {'mango', 'apple', 'banana', 'cherry', 'strawberry', 'pear'}
# {'mango', 'apple', 'banana', 'cherry', 'strawberry', 'pear'}

합집합의 경우도 교집합처럼 두 인지의 순서가 바뀌어도 동일한 결과를 리턴한다.

차집합 - -, difference()

두 집합의 차집합은 마이너스 기호 '-' 혹은 difference() 메소드를 이용해 구할 수 있다.

my_fruits = {'apple', 'banana', 'pear', 'strawberry'}
your_fruits = {'cherry', 'banana', 'strawberry', 'mango'}

print (my_fruits - your_fruits)
print (my_fruits.difference(your_fruits))
print (your_fruits.difference(my_fruits))

# {'apple', 'pear'}
# {'apple', 'pear'}
# {'mango', 'cherry'}

차집합의 경우 인자의 순서가 바뀌면 결과값이 바뀐다. 따라서 어떤 차집합을 구할 것인지를 명확히 이해하고 연산을 사용해야한다.

서로 같은지 - =

두 집합이 서로 같은 집합인지 판단하기 위해서 '=' 연산을 사용할 수 있다. 즉, 모든 엘리먼트의 값이 동일한 경우를 찾기 위해서 = 연산을 사용할 수 있다.

my_fruits = {'apple', 'banana', 'pear', 'strawberry'}
your_fruits = {'cherry', 'banana', 'strawberry', 'mango'}
whose_fruits = {'apple', 'banana', 'pear', 'strawberry'}

if whose_fruits == your_fruits:
    print('your_fruits')

if whose_fruits == my_fruits:
    print('my_fruits')


# my_fruits

서로소 집합 - disjoint()

두 집합의 엘리먼트 중에 값이 같은 엘리먼트가 하나도 없는 경우를 서로소 관계라고 한다. 즉 교집합이 하나도 없는 경우를 서로소 집합이라고 한다. 두 집합이 서로소 관계인지 확인하기 위해서 disjoint() 메소드를 사용할 수 있다.

my_fruits = {'apple', 'banana', 'pear'}
your_fruits = {'cherry', 'banana', 'strawberry'}
other_fruits = {'orange', 'melon', 'cherry'}

if other_fruits.isdisjoint(your_fruits):
    print('your_fruits is disjoint')

if other_fruits.isdisjoint(my_fruits):
    print('my_fruits is disjoint')

# my_fruits is disjoint

 

파이썬 스크립트 작성에 도움되는 글 모음

파이썬으로 프로그램을 작성할 때 도움되는 글들을 모아본다. 개발환경 [Python] macOS에 파이참 설치 [Python] 파이참 깃허브 연동 [Python] 파이썬 PIP란? [Python] VSCode를 이용한 개발환경 [Python] python3를

hbase.tistory.com

 

[Python] 튜플(tuple) 자료형 사용법 및 예제

파이썬의 튜플은 여러 데이터를 묶어서 같이 처리할 수 있게 해주는 자료형 중 하나다. 위키백과에서 설명하는 튜플은 "셀 수 있는 수랴의 순서 있는 열거"다. 튜플은 리스트와 거의 유사하게 사

hbase.tistory.com

 

[Python] 딕셔너리(dict) 자료형 사용법 및 예제

파이썬은 '딕셔너리(Dictionary)'라고 하는 자료형을 제공한다. 다른 언어에서는 '해시(Hash)', '연관배열(Associative Array)' 혹은 '맵(Map)' 등으로 불리는 자료형이다. 이 자료형은 Key 값과 그 Key 값에 특

hbase.tistory.com

 

[Python] 리스트(list) 자료형 사용법 및 예제

리스트는 일련의 데이터를 묶어서 같이 처리할 수 있게 해주는 자료형 중 하나다. 관련있는 데이터들을 하나의 리스트에 담아서 함께 처리하는 코드는 파이썬에서 굉장히 흔하게 사용된다. 이

hbase.tistory.com

댓글