코드 예제가 포함된 완전한 가이드

이 자습서에서는 Python 집합의 기본 사항과 Python 집합을 수정하는 데 사용할 수 있는 다양한 집합 메서드를 배웁니다.

집합은 Python의 기본 제공 데이터 구조 중 하나입니다. 반복되지 않는 요소 컬렉션으로 작업해야 하는 경우 집합을 이동 데이터 구조로 사용합니다.

다음 여러 섹션에서 파이썬 집합의 기본 사항과 이를 사용하여 작업할 수 있는 집합 메서드를 살펴보겠습니다. 그런 다음 Python에서 일반적인 집합 연산을 수행하는 방법을 배웁니다.

의 시작하자!

파이썬 세트의 기초

Python에서 집합은 반복되지 않는 요소의 정렬되지 않은 컬렉션입니다. 이는 집합의 요소가 모두 구별되어야 함을 의미합니다.

세트에서 요소를 추가 및 제거할 수 있습니다. 따라서 집합은 변경 가능한 컬렉션입니다. 다른 데이터 유형의 요소를 포함할 수 있습니다. 그러나 집합의 개별 요소는 다음과 같아야 합니다. 해시 가능한.

파이썬에서 객체의 해시 값이 절대 변경되지 않으면 객체를 해시 가능하다고 합니다. Python 문자열, 튜플 및 사전과 같은 대부분의 변경할 수 없는 개체는 해시 가능합니다.

세트 생성에 대해 자세히 알아보겠습니다. 지금은 다음 두 세트를 고려하십시오.

py_set = {0,1,2,(2,3,4),'Cool!'}
py_set = {0,1,2,[2,3,4],'Oops!'}

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-40-2d3716c7fe01> in <module>()
----> 1 py_set = {0,1,2,[2,3,4],'Oops!'}

TypeError: unhashable type: 'list'

첫 번째 집합에는 세 개의 숫자, 튜플 및 문자열이 포함됩니다. 세트 초기화는 오류 없이 실행됩니다. 반면 두 번째 세트에는 튜플 대신 목록이 포함됩니다. 목록은 변경 가능한 컬렉션이며 해시할 수 없으며 초기화 시 TypeError가 발생합니다.

📑 이 모든 것을 종합하면 Python 집합을 고유하고 해시 가능한 요소의 변경 가능한 컬렉션으로 정의할 수 있습니다.

파이썬 세트를 만드는 방법

Python에서 집합을 만드는 방법을 배우는 것으로 시작하겠습니다.

#1. 명시적 초기화 사용

쉼표(,)로 구분하고 한 쌍의 중괄호 {}로 묶은 집합의 요소를 지정하여 Python에서 집합을 생성할 수 있습니다.

py_set1 = {'Python','C','C++','JavaScript'}
type(py_set1)

# Output
set

이전에 Python 목록으로 작업한 적이 있다면 [] 빈 목록을 초기화합니다. Python 집합이 한 쌍의 중괄호 {}로 묶인 경우에도 {} 쌍을 사용하여 집합을 초기화할 수 없습니다. 이는 {}가 Python 세트가 아니라 Python 사전을 초기화하기 때문입니다.

py_set2 = {}
type(py_set2)

# Output
dict

다시 type() 함수를 호출하여 py_set이 사전(dict)인지 확인할 수 있습니다.

  Linux에서 911 오퍼레이터를 플레이하는 방법

#2. set() 함수 사용

빈 집합을 초기화한 다음 요소를 추가하려면 set() 함수를 사용하면 됩니다.

py_set3 = set()
type(py_set3)

# Output
set

#삼. 다른 이터러블을 세트로 캐스팅하기

집합을 만드는 또 다른 방법은 set(iterable)을 사용하여 목록 및 튜플과 같은 다른 이터러블을 집합으로 캐스팅하는 것입니다.

py_list = ['Python','C','C++','JavaScript','C']
py_set4 = set(py_list)
print(py_set4)
# {'C++', 'C', 'JavaScript', 'Python'} # repeating element 'C' removed
type(py_set4)
# set

위의 예에서 py_list는 ‘C’를 두 번 포함합니다. 그러나 py_set4에서 ‘C’는 집합이 고유한 요소의 모음이므로 한 번만 나타납니다. 집합으로 캐스팅하는 이 기술은 종종 Python 목록에서 중복을 제거하는 데 사용됩니다.

Python 세트에 요소를 추가하는 방법

빈 집합 py_set을 생성하여 시작하고 이 자습서의 나머지 부분에서 작업해 보겠습니다.

py_set = set()
len(py_set) # returns the length of a set
# Output
0

#1. .add() 메서드 사용

세트에 요소를 추가하려면 .add() 메서드를 사용할 수 있습니다. set.add(element)는 집합에 요소를 추가합니다.

명확성을 위해 Python 세트에 요소를 추가하고 각 단계에서 세트를 인쇄합니다.

▶️ py_set에 ‘Python’ 문자열을 요소로 추가해 봅시다.

py_set.add('Python')
print(py_set)

# Output
{'Python'}

다음으로 다른 요소를 추가합니다.

py_set.add('C++')
print(py_set)

# Output
{'Python', 'C++'}

.add() 메서드는 요소가 아직 없는 경우에만 집합에 요소를 추가한다는 것을 이해하는 것이 중요합니다. 세트에 추가하려는 요소가 이미 포함되어 있는 경우 추가 작업은 효과가 없습니다.

이를 확인하기 위해 py_set에 ‘C++’를 추가해 보겠습니다.

py_set.add('C++')
print(py_set)

# Output
{'Python', 'C++'}

세트에 ‘C++’가 포함되어 있으므로 추가 작업은 효과가 없습니다.

▶️ 세트에 몇 가지 요소를 더 추가해 봅시다.

py_set.add('C')
print(py_set)
py_set.add('JavaScript')
print(py_set)
py_set.add('Rust')
print(py_set)

# Output
{'Python', 'C++', 'C'}
{'JavaScript', 'Python', 'C++', 'C'}
{'Rust', 'JavaScript', 'Python', 'C++', 'C'}

#2. .update() 메서드 사용

지금까지 한 번에 한 요소씩 기존 집합에 요소를 추가하는 방법을 살펴보았습니다.

요소 시퀀스에 둘 이상의 요소를 추가하려면 어떻게 해야 합니까?

set.update(collection) 구문과 함께 .update() 메서드를 사용하여 컬렉션의 요소를 집합에 추가할 수 있습니다. 컬렉션은 목록, 튜플, 사전 등이 될 수 있습니다.

py_set.update(['Julia','Ruby','Scala','Java'])
print(py_set)

# Output
{'C', 'C++', 'Java', 'JavaScript', 'Julia', 'Python', 'Ruby', 'Rust', 'Scala'}

이 방법은 메모리에 다른 객체를 생성하지 않고 집합에 요소 컬렉션을 추가하려는 경우에 유용합니다.

다음 섹션에서는 집합에서 요소를 제거하는 방법을 알아보겠습니다.

Python 세트에서 요소를 제거하는 방법

다음 세트(업데이트 작업 전의 py_set)를 고려해 보겠습니다.

py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}

#1. .pop() 메서드 사용

set.pop()은 세트에서 무작위로 요소를 제거하고 반환합니다. py_set에서 pop 메소드를 호출하고 그것이 무엇을 반환하는지 봅시다.

py_set.pop()

# Output
'Rust'

이번에는 .pop() 메서드 호출이 ‘Rust’ 문자열을 반환했습니다.

참고: .pop() 메서드는 임의의 요소를 반환하므로 끝에서 코드를 실행할 때 다른 요소를 얻을 수도 있습니다.

세트를 검사할 때 ‘녹’은 더 이상 세트에 존재하지 않습니다.

print(py_set)

# Output
{'JavaScript', 'Python', 'C++', 'C'}

#2. .remove() 및 폐기() 메서드 사용

실제로는 집합에서 특정 요소를 제거할 수 있습니다. 이렇게 하려면 .remove() 및 .discard() 메서드를 사용할 수 있습니다.

set.remove(element)는 집합에서 요소를 제거합니다.

py_set.remove('C')
print(py_set)

# Output
{'JavaScript', 'Python', 'C++'}

세트에 없는 요소를 제거하려고 하면 KeyError가 발생합니다.

py_set.remove('Scala')

# Output
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-58-a1abab3a8892> in <module>()
----> 1 py_set.remove('Scala')

KeyError: 'Scala'

다시 py_set을 살펴보겠습니다. 이제 세 가지 요소가 있습니다.

print(py_set)

# Output
{'JavaScript', 'Python', 'C++'}

set.discard(element) 구문을 사용하면 .discard() 메서드도 집합에서 요소를 제거합니다.

py_set.discard('C++')
print(py_set)

# Output
{'JavaScript', 'Python'}

그러나 존재하지 않는 요소를 제거하려고 할 때 KeyError를 발생시키지 않는다는 점에서 .remove() 메서드와 다릅니다.

  지금 구매해야 할 울트라와이드 모니터 13종

.discard() 메서드를 사용하여 목록에서 ‘Scala'(존재하지 않음)를 제거하려고 하면 오류가 표시되지 않습니다.

py_set.discard('Scala') #no error!
print(py_set)

# Output
{'JavaScript', 'Python'}

Python 세트의 요소에 액세스하는 방법

지금까지 Python 집합에서 요소를 추가하고 제거하는 방법을 배웠습니다. 그러나 집합의 개별 요소에 액세스하는 방법을 아직 보지 못했습니다.

집합은 순서가 지정되지 않은 컬렉션이므로 인덱싱할 수 없습니다. 따라서 인덱스를 사용하여 집합의 요소에 액세스하려고 하면 그림과 같이 오류가 발생합니다.

py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}

print(py_set[0])

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-27-0329274f4580> in <module>()
----> 1 print(py_set[0])

TypeError: 'set' object is not subscriptable

그렇다면 집합의 요소에 어떻게 액세스합니까?

이를 수행하는 두 가지 일반적인 방법이 있습니다.

  • 집합을 반복하고 각 요소에 액세스
  • 특정 요소가 집합의 구성원인지 확인

▶️ for 루프를 사용하여 집합 및 액세스 요소를 반복합니다.

for elt in py_set:
  print(elt)

# Output
C++
JavaScript
Python
Rust
C

실제로는 in 연산자를 사용하여 주어진 요소가 집합에 있는지 확인하고 싶을 수 있습니다.

참고: 집합의 요소는 요소가 집합에 있으면 True를 반환합니다. 그렇지 않으면 False를 반환합니다.

이 예에서 py_set은 ‘C++’를 포함하고 ‘ Julia’는 포함하지 않으며 in 연산자는 각각 True 및 False를 반환합니다.

'C++' in py_set
# True
'Julia' in py_set
# False

파이썬 세트의 길이를 찾는 방법

앞에서 보았듯이 len() 함수를 사용하여 집합에 있는 요소의 수를 가져올 수 있습니다.

py_set = {'C++', 'JavaScript', 'Python', 'Rust', 'C'}
len(py_set)

# Output: 5

파이썬 세트를 지우는 방법

모든 요소를 ​​제거하여 집합을 지우려면 .clear() 메서드를 사용할 수 있습니다.

py_set에서 .clear() 메소드를 호출합시다.

py_set.clear()

출력하려고 하면 set()이 표시되며 이는 집합이 비어 있음을 나타냅니다. len() 함수를 호출하여 집합의 길이가 0인지 확인할 수도 있습니다.

print(py_set)
# set()
print(len(py_set))
# 0

지금까지 Python 세트에서 기본 CRUD 작업을 수행하는 방법을 배웠습니다.

  • 생성: set() 함수를 사용하여 유형 캐스팅 및 초기화
  • 읽기: 회원 테스트를 위해 루프 및 in 연산자를 사용하여 집합의 요소에 액세스
  • 업데이트: 세트에서 요소 추가, 제거 및 세트 업데이트
  • 삭제: 집합에서 모든 요소를 ​​제거하여 집합을 지웁니다.

Python 코드로 설명하는 공통 집합 연산

Python 집합을 사용하면 기본 집합 작업도 수행할 수 있습니다. 우리는 이 섹션에서 그들에 대해 배울 것입니다.

#1. Python의 집합 합집합

집합 이론에서 두 집합의 합집합은 두 집합 중 적어도 하나에 있는 모든 요소의 집합입니다. A와 B라는 두 개의 집합이 있는 경우 합집합에는 A에만 있는 요소, B에만 있는 요소, A와 B 모두에 있는 요소가 포함됩니다.

집합의 합집합을 찾으려면 | 연산자 또는 .union() 구문을 사용하는 메서드: setA.union(setB).

setA = {1,3,5,7,9}
setB = {2,4,6,8,9}

print(setA | setB)
# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}

setA.union(setB)

# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}

집합 합집합은 가환 연산입니다. 따라서 AUB는 BU A와 동일합니다. .union() 메서드 호출에서 setA와 setB의 위치를 ​​바꿔서 이를 확인하겠습니다.

setB.union(setA)

# Output
{1, 2, 3, 4, 5, 6, 7, 8, 9}

#2. 파이썬에서 집합의 교집합

또 다른 결합 집합 연산은 두 집합 A와 B의 교차입니다. 교차 집합 연산은 A와 B에 있는 모든 요소를 ​​포함하는 집합을 반환합니다.

  휴대용 충전기로 어디에서나 노트북을 충전하는 방법

교집합을 계산하려면 아래 코드 조각에 설명된 대로 & 연산자 또는 .intersection() 메서드를 사용할 수 있습니다.

print(setA & setB)

# Output
{9}

setA.intersection(setB)

# Output
{9}

이 예에서 요소 9는 setA와 setB 모두에 있습니다. 따라서 교차 세트에는 이 요소만 포함됩니다.

집합 합집합과 마찬가지로 집합 교집합도 가환 연산입니다.

setB.intersection(setA)

# Output
{9}

#삼. Python에서 차이 설정

두 집합이 주어졌을 때 합집합과 교집합은 각각 두 집합과 적어도 하나의 집합에 있는 요소를 찾는 데 도움이 됩니다. 반면에 집합 차이는 한 집합에는 있지만 다른 집합에는 없는 요소를 찾는 데 도움이 됩니다.

– setA.difference(setB)는 setA에만 있고 setB에는 없는 요소 집합을 제공합니다.

– setB.difference(setA)는 setB에만 있고 setA에는 없는 요소 집합을 제공합니다.

print(setA - setB)

print(setB - setA)

# Output
{1, 3, 5, 7}
{8, 2, 4, 6}

분명히 AB는 BA와 같지 않으므로 집합 차이는 가환 연산이 아닙니다.

setA.difference(setB)
# {1, 3, 5, 7}

setB.difference(setA)
# {2, 4, 6, 8}

#4. Python의 대칭 집합 차이

집합 교차는 두 집합에 있는 요소를 제공하지만 대칭 집합 차이는 정확히 한 집합에 있는 요소 집합을 반환합니다.

다음 예를 고려하십시오.

setA = {1,3,5,7,10,12}
setB = {2,4,6,8,10,12}

대칭 차이 집합을 계산하려면 ^ 연산자 또는 .symmetric_difference() 메서드를 사용할 수 있습니다.

print(setA ^ setB)

# Output
{1, 2, 3, 4, 5, 6, 7, 8}

요소 10과 12는 setA와 setB 모두에 있습니다. 따라서 대칭 차 집합에는 존재하지 않습니다.

setA.symmetric_difference(setB)

# Output
{1, 2, 3, 4, 5, 6, 7, 8}

대칭 집합 차이 연산은 두 집합 중 정확히 하나에 나타나는 모든 요소를 ​​수집하므로 결과 집합은 요소가 수집되는 순서에 관계없이 동일합니다. 따라서 대칭 집합 차이는 가환 연산입니다.

setB.symmetric_difference(setA)

# Output
{1, 2, 3, 4, 5, 6, 7, 8}

#5. Python의 하위 집합과 상위 집합

집합 이론에서 하위 집합과 상위 집합은 두 집합 간의 관계를 이해하는 데 도움이 됩니다.

두 집합 A와 B가 주어졌을 때 집합 B의 모든 요소가 집합 A에도 존재하면 집합 B는 집합 A의 부분집합입니다. 그리고 집합 A는 집합 B의 상위 집합입니다.

언어 및 언어 확장의 두 가지 예를 고려하십시오.

languages = {'Python', 'JavaScript','C','C++'}
languages_extended = {'Python', 'JavaScript','C','C++','Rust','Go','Scala'}

Python에서는 .issubset() 메서드를 사용하여 주어진 집합이 다른 집합의 하위 집합인지 확인할 수 있습니다.

setA.issubset(setB)는 setA가 setB의 하위 집합이면 True를 반환합니다. 그렇지 않으면 False를 반환합니다.

이 예에서 언어는 languages_extended의 하위 집합입니다.

languages.issubset(languages_extended)
# Output
True

마찬가지로 .issuperset() 메서드를 사용하여 주어진 집합이 다른 집합의 상위 집합인지 확인할 수 있습니다.

setA.issuperset(setB)는 setA가 setB의 상위 집합이면 True를 반환합니다. 그렇지 않으면 False를 반환합니다.

languages_extended.issuperset(languages)
# Output
True

Languages_extended는 언어의 상위 집합이므로, 위에서 볼 수 있듯이 languages_extended.issuperset(languages)는 True를 반환합니다.

결론

이 튜토리얼이 파이썬 세트의 작동, CRUD 작업을 위한 세트 메소드 및 일반적인 세트 작업을 이해하는 데 도움이 되었기를 바랍니다. 다음 단계로 Python 프로젝트에서 사용해 볼 수 있습니다.

다른 심층 Python 가이드를 확인할 수 있습니다. 즐거운 배움!