파이썬 집합 (Python Sets)

PythonBeginner
지금 연습하기

소개

Python Set 에 대한 실습에 오신 것을 환영합니다! Python 은 리스트 (lists), 딕셔너리 (dictionaries), 튜플 (tuples) 및 **집합 (sets)**을 포함하여 데이터를 구성하기 위한 여러 내장 데이터 타입을 제공합니다.

공식 Python 문서에 따르면, 집합은 중복 요소가 없는 순서가 없는 (unordered) 컬렉션입니다. 주요 용도는 멤버십 테스트 (membership testing) 와 중복 항목 제거입니다.

본 실습에서는 일련의 실습을 통해 집합을 생성, 조작 및 효과적으로 사용하는 방법을 탐구하게 됩니다.

집합 초기화 (Initializing a Set)

이 단계에서는 Python 에서 set 을 생성하는 두 가지 주요 방법, 즉 중괄호 {} 사용과 내장 함수 set() 사용법을 배웁니다. 빈 중괄호 {}를 사용하면 빈 set 이 아닌 빈 dictionary 가 생성된다는 점을 이해하는 것이 중요합니다.

참고: WebIDE(VS Code 와 유사) 사용에 익숙하지 않다면, 이 랩에서 먼저 학습하십시오.

먼저, 왼쪽 파일 탐색기에서 step1.py 파일을 엽니다.

이제 다음 코드를 step1.py에 복사하여 붙여넣습니다. 이 코드는 set 을 생성하는 방법을 시연하고 빈 set 생성의 특수한 경우를 강조합니다.

## Create set using curly braces or set() function
s_braces = {1, 2, 3}
print(f"Set with braces: {s_braces}, type: {type(s_braces)}")

s_func = set([1, 2, 3])
print(f"Set with function: {s_func}, type: {type(s_func)}")

## Warning: empty {} creates a dictionary, not a set
s_dict = {}
print(f"Empty braces create a: {type(s_dict)}")

## To create an empty set, you must use set()
s_empty = set()
print(f"To create an empty set use set(): {type(s_empty)}")

파일을 저장한 다음, 다음 명령어를 실행하여 터미널에서 실행합니다.

python3 step1.py

생성된 객체의 유형을 확인하는 다음 출력이 표시되어야 합니다. {}가 <class 'dict'>로 결과가 나오는 것에 유의하십시오.

Set with braces: {1, 2, 3}, type: <class 'set'>
Set with function: {1, 2, 3}, type: <class 'set'>
Empty braces create a: <class 'dict'>
To create an empty set use set(): <class 'set'>

집합 속성 이해하기 (Understanding Set Properties)

이 단계에서는 집합의 핵심 속성을 탐구합니다. 집합은 고유성 (uniqueness) 을 자동으로 강제하고 순서가 없기 때문에 강력합니다. 이는 집합이 중복 값을 자동으로 제거하며, 인덱스 (index) 를 사용하여 요소에 접근할 수 없음을 의미합니다.

step2.py 파일을 엽니다.

다음 코드를 step2.py에 복사하여 붙여넣습니다. 코드의 첫 번째 부분은 중복이 어떻게 처리되는지 보여주고, 두 번째 부분은 집합에 인덱스로 접근하려고 할 때 발생하는 상황을 보여줍니다.

## Sets automatically remove duplicates
s_duplicates = {1, 2, 3, 2, 3, 4}
print(f"Original with duplicates: {{1, 2, 3, 2, 3, 4}}")
print(f"Set with duplicates removed: {s_duplicates}")

## Sets are unordered and cannot be indexed
print("\nAttempting to access a set by index...")
try:
    s = {1, 2, 3}
    s[0]
except TypeError as e:
    print(f"Error when indexing: {e}")

이제 터미널에서 스크립트를 실행합니다.

python3 step2.py

출력 결과는 다음과 같습니다.

Original with duplicates: {1, 2, 3, 2, 3, 4}
Set with duplicates removed: {1, 2, 3, 4}

Attempting to access a set by index...
Error when indexing: 'set' object is not subscriptable

보시다시피 중복된 2와 3이 자동으로 제거되었습니다. s[0]에 접근하려는 시도는 TypeError를 발생시켜 집합이 인덱싱을 지원하지 않음을 확인시켜 줍니다.

요소 추가 및 업데이트 (Adding and Updating Elements)

이 단계에서는 기존 집합에 새 요소를 추가하는 방법을 배웁니다. Python 은 이를 위해 두 가지 주요 메서드를 제공합니다: 단일 요소를 추가하는 add()와 반복 가능한 객체 (iterable, 리스트나 다른 집합 등) 로부터 여러 요소를 추가하는 update()입니다.

step3.py 파일을 엽니다.

다음 코드를 step3.py에 복사하여 붙여넣습니다. 이 코드는 먼저 집합을 생성한 다음, 단일 요소를 추가하고, 마지막으로 여러 요소로 집합을 업데이트합니다.

## Start with a set
s = {1, 2, 3}
print(f"Original set: {s}")

## add() method: add a single element
s.add(4)
print(f"After adding 4: {s}")

## update() method: add multiple elements from an iterable
s.update([2, 3, 4, 5, 6])  ## Duplicates like 2, 3, 4 are ignored
print(f"After updating with [2, 3, 4, 5, 6]: {s}")

터미널에서 스크립트를 실행합니다.

python3 step3.py

출력 결과는 다음과 같아야 합니다. update()를 사용할 때 이미 집합에 있는 요소는 단순히 무시된다는 점에 유의하십시오.

Original set: {1, 2, 3}
After adding 4: {1, 2, 3, 4}
After updating with [2, 3, 4, 5, 6]: {1, 2, 3, 4, 5, 6}

요소 제거 및 버리기 (Removing and Discarding Elements)

이 단계에서는 집합에서 요소를 제거하는 두 가지 방법인 remove()와 discard()에 대해 배웁니다. 두 메서드 모두 요소를 제거하지만, 요소가 없을 때 다르게 동작합니다. remove()는 KeyError를 발생시켜 처리하지 않으면 프로그램이 중단될 수 있는 반면, discard()는 아무 작업도 하지 않고 조용히 넘어갑니다.

step4.py 파일을 엽니다.

두 메서드의 동작을 시연하는 다음 코드를 복사하여 step4.py에 붙여넣습니다.

## remove() method: raises KeyError if element is not found
s = {1, 2, 3}
print(f"Original set: {s}")
s.remove(3)
print(f"After removing 3: {s}")

## Trying to remove an element that doesn't exist with remove()
try:
    s.remove(3)
except KeyError as e:
    print(f"Error when removing 3 again: KeyError: {e}")

## discard() method: does not raise an error if element is not found
s = {1, 2, 3}
print(f"\nNew original set: {s}")
s.discard(3)
print(f"After discarding 3: {s}")
s.discard(3) ## No error is raised
print(f"After discarding 3 again (no error): {s}")

터미널에서 스크립트를 실행합니다.

python3 step4.py

출력 결과는 차이점을 명확하게 보여줍니다.

Original set: {1, 2, 3}
After removing 3: {1, 2}
Error when removing 3 again: KeyError: 3

New original set: {1, 2, 3}
After discarding 3: {1, 2}
After discarding 3 again (no error): {1, 2}

remove()와 discard() 중 어느 것을 선택할지는 요소가 누락되었을 때 프로그램이 명시적으로 오류를 발생시키기를 원하는지, 아니면 부드럽게 (gracefully) 부재를 처리하기를 원하는지에 따라 달라집니다.

집합 연산 (Set Operations)

마지막 단계에서는 가장 일반적인 집합 연산을 연습합니다. 이러한 연산을 통해 집합을 강력한 방식으로 결합하고 비교할 수 있습니다. 메서드 구문 (예: s1.union(s2)) 과 연산자 구문 (예: s1 | s2) 을 모두 사용하게 됩니다.

  • 합집합 (Union) (union() 또는 |): 제공된 모든 집합의 모든 요소를 포함하는 새 집합을 생성합니다.
  • 교집합 (Intersection) (intersection() 또는 &): 모든 집합에 공통된 요소만 포함하는 새 집합을 반환합니다.
  • 차집합 (Difference) (difference() 또는 -): 첫 번째 집합에는 있지만 두 번째 집합에는 없는 요소를 포함하는 새 집합을 반환합니다.
  • 대칭 차집합 (Symmetric Difference) (symmetric_difference() 또는 ^): 두 집합 중 하나에는 있지만 둘 다에는 없는 요소를 포함하는 새 집합을 반환합니다.

step5.py 파일을 엽니다.

다음 코드를 복사하여 step5.py에 붙여넣어 두 샘플 집합에 대해 이 네 가지 연산을 수행합니다.

s1 = {1, 2, 3}
s2 = {2, 3, 4}
print(f"s1 = {s1}")
print(f"s2 = {s2}\n")

## union() or |
## Returns a new set containing all items from both sets.
print(f"Union (s1 | s2): {s1.union(s2)}")

## intersection() or &
## Returns a new set containing items common to both sets.
s3 = {3, 4, 5}
print(f"Intersection (s1 & s2): {s1.intersection(s2)}")

## difference() or -
## Returns a new set containing items in the first set but not in the second.
print(f"Difference (s1 - s2): {s1.difference(s2)}")
print(f"Difference (s2 - s1): {s2.difference(s1)}")

## symmetric_difference() or ^
## Returns a new set with elements in either set, but not both.
print(f"Symmetric Difference (s1 ^ s2): {s1.symmetric_difference(s2)}")

터미널에서 스크립트를 실행합니다.

python3 step5.py

각 연산의 결과를 이해하기 위해 출력을 검토합니다.

s1 = {1, 2, 3}
s2 = {2, 3, 4}

Union (s1 | s2): {1, 2, 3, 4}
Intersection (s1 & s2): {2, 3}
Difference (s1 - s2): {1}
Difference (s2 - s1): {4}
Symmetric Difference (s1 ^ s2): {1, 4}

요약

본 랩 (lab) 에서는 Python 집합 (set) 의 기본 사항을 학습했습니다. 중괄호 {}와 set() 함수를 모두 사용하여 집합을 초기화하는 것으로 시작했으며, 빈 집합을 생성할 때의 중요한 차이점을 확인했습니다. 집합의 핵심 속성인 순서가 없고 고유한 요소만 저장한다는 것을 탐구했습니다. add()와 update()를 사용하여 요소를 추가하고, remove()와 discard() 메서드를 사용하여 요소를 제거하는 방법을 연습했으며, 이 둘의 주요 차이점을 이해했습니다. 마지막으로 합집합 (|), 교집합 (&), 차집합 (-), 대칭 차집합 (^) 을 포함한 필수 집합 연산을 수행했습니다. 이제 Python 프로그램에서 고유 항목 컬렉션을 처리하기 위해 집합을 사용하는 데 대한 견고한 기반을 갖추게 되었습니다.