3.3 세트 (Set) Last updated: 2023-10-24 18:56:17

집합 자료형은 여러개의 데이터를 한 번에 저장하고 관리하는 데이터형으로 각 요소는 앞에서 배운 정수, 실수, 문자열 등이 될 수 있고, 클래스 객체나 다른 집합 데이터가 될 수도 있다. 파이썬은 집합 데이터를 다룰 수 있는 편리한 기능들을 제공하고 포함할 수 있는 데이터의 종류도 더 유연한 장점을 가지고 있다.

3.3 세트 (Set)

세트는 집합을 나타내는 시퀀스 데이터 유형이다. 세트를 사용하는 이유는 무엇일까? 세트는 값을 키값으로 관리하여 목록을 관리하고, 값의 포함 여부를 확인하는데 사용한다. 이미 값이 있더라도 상관 없이 추가할 수 있고, 키가 없더라도 상관없이 제거할 수 있다. 세트의 특징은 다음과 같다.

  1. 동일한 값이 중복될 수 없다.

  2. 인덱스(index)로 접근할 수 없다.

  3. 합집합, 교집합, 차집합 등 집합 연산이 가능하다.

3.3.1 세트 생성

세트를 생성하려면 중괄호(‘{}’)로 값의 배열을 감싸면 된다.

세트를 생성하는 예시를 확인해보자.



[예제 3- 115] 세트 생성하기

# [1] 중괄호 사이에 쉼표로 구분하여 항목을 나열한다.
fruits = {'apple', 'banana', 'orange', 'peach'}
fruits

[결과]

{'apple', 'banana', 'orange', 'peach'}

[예제 3- 116] 중복된 항목으로 세트 생성하기

# [2] 중복된 항목이 있더라도 중복을 제거하고 생성된다.
fruits = {'apple', 'banana', 'orange', 'peach', 'apple', 'orange'}
fruits

[결과]

{'apple', 'banana', 'orange', 'peach'}


3.3.2 세트 자료형 다루기


A. 항목 한 개 추가

세트 데이터 형 변수가 생성된 이후에는 이를 사전의 키맵과 같이 사용할 수 있다. 새로운 키값이 발생하면 세트 변수에 추가하고, 불필요한 키는 삭제할 수 있다. 세트에서 항목을 한 개 추가하려면 add( ) 메서드를 이용한다.

[예제 3- 117] add( ) 메서드로 세트 항목 추가하기

fruits = {'apple', 'banana', 'orange', 'peach'}
fruits.add('melon')
fruits

[결과]

{'apple', 'banana', 'melon', 'orange', 'peach'}

기존 set 변수 목록에 ‘melon’항목이 추가되었다. 없던 항목이므로 추가되었고, 순서는 오름차순으로 정렬되어 있다.



B. 항목 여러 개 추가

세트에서 항목을 여러 개를 한꺼번에 추가하려면 update( ) 메서드를 이용한다. update( ) 메서드의 인자로는 업데이트할 항목들의 집합이다. 리스트, 튜플, 세트 모두 가능하다. 원래 있는 세트 항목에 포함되는 항목에 추가되더라도 관계 없이 중복되지 않은 항목을 관리한다.

형식

set_var.update([value1, value2, …])

파라미터

set_vcar은 세트 객체이다.

• value1 (object) : 추가할 첫 번째 항목
• value2 (object) : 추가할 두 번째 항목

[예제 3- 118] 중복된 항목 업데이트 하기

# [1] apple은 중복되었지만 오류가 나지 않고, 결과에는 apple이 한번만 포함되었다.
fruits = {'apple', 'banana', 'orange', 'peach'}
fruits.update(['melon', 'grape', 'pear', 'apple'])
fruits

[결과]

{'apple', 'banana', 'grape', 'melon', 'orange', 'peach', 'pear'}


C. 항목 한 개 삭제

세트 목록에서 특정 항목을 삭제하려면 remove( ) 메서드를 이용한다. remove( ) 메서드의 인자로 삭제할 항목의 값을 넘겨준다. 하지만 remove( ) 메서드로 항목을 삭제할 때 세트 목록에 포함되어 있어야 한다. 만일 존재하지 않는 항목을 삭제하려고 하면 오류가 발생된다.

형식

set_var.remove(value)

파라미터

set_var은 세트 객체이다.

• value (object) : 삭제할 값 혹은 객체

[예제 3- 119] 세트에서 항목 삭제하기

# [1] 세트 목록에서 banana를 삭제한다.
fruits = {'apple', 'banana', 'orange', 'peach'}
fruits.remove('banana')
fruits

[결과]

{'apple', 'orange', 'peach'}

[예제 3- 120] 세트에서 존재하지 않는 항목 삭제하기

fruits = {'apple', 'banana', 'orange', 'peach'}
fruits.remove('melon')

[결과]

KeyError: 'melon'

세트에서 존재하지 않는 항목을 삭제할 경우 오류가 발생한다.


[예제 3- 121] 세트에서 항목 검사 후 삭제하기

fruits = {'apple', 'banana', 'orange', 'peach'}
if 'melon' in fruits:
    fruits.remove('melon')
fruits

[결과]

{'apple', 'orange', 'peach'}

삭제하기 전에 in 명령으로 항목이 존재하는지 검사하고 삭제하면 오류를 방지할 수 있다.


세트 목록에 존재 여부와 상관 없이 항목을 삭제하려고 할 때는 discard( ) 메서드를 사용한다. discard( ) 메서드를 사용하면 remove( ) 메서드와는 다르게 삭제하려는 항목이 존재하지 않더라도 오류를 발생시키지 않는다.

형식

set_var.discard(value)

파라미터

set_var은 세트 객체이다.

• value (object) : 삭제할 값 혹은 객체

[예제 3- 122] discard( ) 함수 이용해 세트 항목 삭제하기

fruits = {'apple', 'banana', 'orange', 'peach'}
fruits.discard('banana')
fruits

[결과]

{'apple', 'banana', 'peach'}

세트 목록에서 banana를 삭제한다.


[예제 3- 123] discard( ) 함수 이용 존재와 상관 없이 항목 삭제하기

# [2] 세트에서 존재하지 않는 항목을 삭제해도 오류가 나지 않는다. 항목이 있는지 검사할 필요가 없다.
fruits = {'apple', 'banana', 'orange', 'peach'}
fruits.discard('melon')
fruits

[결과]

{'apple', 'banana', 'orange', 'peach'}


D. 항목 랜덤으로 꺼내기

세트 항목들을 하나씩 임의로 꺼내는 방법은 pop( ) 메서드를 사용하는 것이다. 꺼낸다는 것은 목록에서 제거하고 반환한다는 의미이다. pop( ) 메서드를 실행하면 임의로 항목이 반환 되고, 목록에서는 해당 항목이 삭제된다.

형식

set_var.pop()

파라미터

set_var은 세트 객체이다.

반환

(object) 세트 목록 중에서 임의로 꺼내어진 객체

[예제 3- 124] pop( ) 메서드 이용해 항목 꺼내기

fruits = {'apple', 'banana', 'orange', 'peach'}
f = fruits.pop()
print(fruits, , f)

[결과]

{'apple', 'banana', 'orange'} + peach

pop() 메서드를 호출하니 peach가 반환되었고, 목록에서는 peach가 제거된다.


[예제 3- 125] pop( ) 메서드 이용해 while 반복문 실행하기

fruits = {'apple', 'banana', 'orange', 'peach'}
while len(fruits) > 0:
    f = fruits.pop()
    print(f, len(fruits))

[결과]

peach 3
apple 2
banana 1
orange 0

세트 목록의 항목을 이용해 while 반복문을 실행할 수 있다.



E. 세트들 간의 교집합

두 개의 세트가 존재하는 경우 두 세트에서 겹치는 교집합을 찾아내는데 intersection( ) 메서드를 사용할 수 있다.

형식

set_var1.inseresction(set_var2, …)

파라미터

• set_var1 (set) : 교집합 대상이 되는 첫 번째 세트 변수
• set_var2 (set) : 교집합 대상이 되는 두 번째 세트 변수

반환

(set) 세트 변수들 간에 중복되지 않은 교집합에 해당하는 세트 객체가 반환된다.

[예제 3- 126] 세트에서 중복되는 항목 찾기

fruit_basket1 = {'apple', 'banana', 'orange', 'peach'}
fruit_basket2 = {'melon', 'orange', 'grape', 'peach'}
basket = fruit_basket1.intersection(fruit_basket2)
print(basket)

[결과]

{'peach', 'orange'}

두 개의 과일 바구니 세트에서 중복된 과일 세트를 찾는다.



F. 세트들 간의 합집합

두 개 이상의 세트가 존재하는 경우 모두 포함하는 합집합 세트를 반환하는 메서드는 union( )이다. union( ) 메서드는 자기 자신은 바뀌지 않고 생성된 결과를 반환한다.

형식

set_var1.union(set_var2, …)

파라미터

• set_var1 (set) : 합집합 대상이 되는 첫 번째 세트 변수
• set_var2 (set) : 합집합 대상이 되는 두 번째 세트 변수

반환

(set) 세트 변수들 간 합집합에 해당하는 세트 결과

[예제 3- 127] 두 세트의 합집합 얻어오기

fruit_basket1 = {'apple', 'banana', 'orange', 'peach'}
fruit_basket2 = {'melon', 'orange', 'grape', 'peach'}
basket = fruit_basket1.union(fruit_basket2)
print("fruit_basket1 =>", fruit_basket1)
print("fruit_basket2 =>", fruit_basket2)
print('basket =>', basket)

[결과]

fruit_basket1 => {'peach', 'apple', 'banana', 'orange'}
fruit_basket2 => {'melon', 'peach', 'grape', 'orange'}
basket => {'melon', 'peach', 'apple', 'banana', 'orange', 'grape'}

union( ) 함수를 이용해 두 개 이상의 세트에서 항목이 모두 포함된 합집합 세트를 생성하여 반환한다.