수색…


통사론

  • empty_set = set () # 빈 세트를 초기화합니다.
  • literal_set = { 'foo', 'bar', 'baz'} # 그 안에 3 개의 문자열이있는 세트를 만듭니다.
  • set_from_list = set ([ 'foo', 'bar', 'baz']) # 새 집합에 대해 set 함수를 호출합니다.
  • set_from_iter = set (범위 (x)의 x는 x) # 임의의 iterable을 사용하여 세트 만들기
  • set_from_iter = {x는 범위 (10)의 i에 대해 [random.randint (0,10)]의 x에 대해}} # 대체 표기법

비고

세트는 순서지정되지 않고 매우 빠른 조회 시간을가집니다 (기술을 얻으려면 상각 된 O (1)). 물건을 모으고 순서는 중요하지 않을 때 사용하는 것이 좋습니다. 이름으로 물건을 많이 보게 될 것입니다. 색인 번호로 항목을 조회하는 것이 더 합리적이라면 대신 목록을 사용하는 것이 좋습니다. 주문이 중요한 경우 목록도 고려하십시오.

세트는 변경 가능 하므로 해시 할 수 없으므로이를 사전 설정 키로 사용하거나 다른 세트 나 해시 가능 유형이 필요한 다른 모든 위치에 넣을 수 없습니다. 이 경우 불변의 frozenset 사용할 수 있습니다.

집합의 요소는 해시 가능 해야합니다. 이것은 올바른 __hash__ 메쏘드를 가지고 있다는 것을 의미합니다. 이것은 __eq__ 와 일치합니다. 일반적으로 listset 과 같은 변경 가능한 타입은 해시 가능하지 않으므로 세트에 넣을 수 없습니다. 이 문제가 발생하면 dict 및 불변 키를 사용하는 것이 좋습니다.

목록의 고유 한 요소 가져 오기

식당 목록을 가지고 있다고 가정 해 봅시다. 아마도 식당에서 그것을 읽을 수 있습니다. 당신은 목록에있는 독특한 레스토랑에 관심이 있습니다. 목록에서 고유 한 요소를 가져 오는 가장 좋은 방법은 집합으로 변환하는 것입니다.

restaurants = ["McDonald's", "Burger King", "McDonald's", "Chicken Chicken"]
unique_restaurants = set(restaurants)
print(unique_restaurants)
# prints {'Chicken Chicken', "McDonald's", 'Burger King'}

세트가 원래 목록과 동일한 순서가 아니라는 점에 유의하십시오. 세트 순서가 있기 때문에 그처럼입니다 dict 의.

이것은 쉽게로 다시 변환 할 수 List 파이썬의 내장과 list 원본과하지만 중복이 동일한 목록이 다른 목록을 제공 기능 :

list(unique_restaurants)
# ['Chicken Chicken', "McDonald's", 'Burger King']

또한 이것을 한 줄로 보는 것이 일반적입니다.

# Removes all duplicates and returns another list
list(set(restaurants))

이제 원래 목록에서 수행 할 수있는 모든 작업을 다시 수행 할 수 있습니다.

세트 작업

다른 세트들과

# Intersection    
{1, 2, 3, 4, 5}.intersection({3, 4, 5, 6})  # {3, 4, 5}
{1, 2, 3, 4, 5} & {3, 4, 5, 6}              # {3, 4, 5}

# Union
{1, 2, 3, 4, 5}.union({3, 4, 5, 6})  # {1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5} | {3, 4, 5, 6}       # {1, 2, 3, 4, 5, 6}

# Difference
{1, 2, 3, 4}.difference({2, 3, 5})  # {1, 4}
{1, 2, 3, 4} - {2, 3, 5}            # {1, 4}

# Symmetric difference with
{1, 2, 3, 4}.symmetric_difference({2, 3, 5})  # {1, 4, 5}
{1, 2, 3, 4} ^ {2, 3, 5}                      # {1, 4, 5}

# Superset check
{1, 2}.issuperset({1, 2, 3})  # False
{1, 2} >= {1, 2, 3}           # False

# Subset check
{1, 2}.issubset({1, 2, 3})  # True
{1, 2} <= {1, 2, 3}         # True

# Disjoint check
{1, 2}.isdisjoint({3, 4})  # True
{1, 2}.isdisjoint({1, 4})  # False

단일 요소가있는

# Existence check
2 in {1,2,3}      # True
4 in {1,2,3}      # False
4 not in {1,2,3}  # True

# Add and Remove
s = {1,2,3}
s.add(4)        # s == {1,2,3,4}

s.discard(3)    # s == {1,2,4}
s.discard(5)    # s == {1,2,4}

s.remove(2)     # s == {1,4}
s.remove(2)     # KeyError!

집합 연산은 새 집합을 반환하지만 해당 위치 버전을 갖습니다.

방법 적절한 작동 내부 배치 방식
노동 조합 s | = t 최신 정보
교차로 s & = t intersection_update
s - = t difference_update
대칭 _ 차이 s ^ = t symmetric_difference_update

예 :

s = {1, 2}
s.update({3, 4})   # s == {1, 2, 3, 4}

세트 대 멀티 세트

세트는 고유 한 요소의 정렬되지 않은 콜렉션입니다. 그러나 때때로 우리는 반드시 뚜렷하게 구별되지 않고 요소의 다양성을 추적하는 요소의 순서가없는 컬렉션으로 작업하기를 원합니다.

다음 예제를 고려하십시오.

>>> setA = {'a','b','b','c'}
>>> setA
set(['a', 'c', 'b'])

문자열 'a' , 'b' , 'b' , 'c' 를 집합 데이터 구조에 저장함으로써 'b' 가 두 번 발생한다는 사실에 대한 정보를 잃어 버렸습니다. 물론 요소를 목록에 저장하면이 정보가 유지됩니다.

>>> listA = ['a','b','b','c']
>>> listA
['a', 'b', 'b', 'c']

하지만 목록 데이터 구조는 계산 속도를 늦추는 추가 불필요한 순서를 도입합니다.

멀티 셋 구현을 위해서 파이썬은 collections 모듈에서 Counter 클래스를 제공한다 (버전 2.7부터) :

Python 2.x 2.7
>>> from collections import Counter
>>> counterA = Counter(['a','b','b','c'])
>>> counterA
Counter({'b': 2, 'a': 1, 'c': 1})

Counter 는 요소가 사전 키로 저장되고 해당 개수가 사전 값으로 저장되는 사전입니다. 그리고 모든 사전처럼, 그것은 순서가없는 컬렉션입니다.

메소드 및 내장 함수를 사용하여 연산 설정

우리는 두 세트 ab 정의한다 a

>>> a = {1, 2, 2, 3, 4}
>>> b = {3, 3, 4, 4, 5}

참고 : {1} 은 하나의 요소 집합을 만들고 {} 은 빈 dict 만듭니다. 빈 세트를 만드는 올바른 방법은 set() 입니다.

교차로

a.intersection(b)ab 둘 다에 존재하는 원소들을 가진 새로운 집합을 반환한다.

>>> a.intersection(b)
{3, 4}

노동 조합

a.union(b)ab 중 하나에 요소가있는 새로운 집합을 반환합니다.

>>> a.union(b)
{1, 2, 3, 4, 5}

a.difference(b) 에 존재하는 요소와 새로운 리턴 있지만에 a b

>>> a.difference(b)
{1, 2}
>>> b.difference(a)
{5}

대칭 차이

a.symmetric_difference(b)a 또는 b 중 하나 a 있지만 둘 다 a 존재하지 않는 요소가있는 새로운 세트를 반환합니다.

>>> a.symmetric_difference(b)
{1, 2, 5}
>>> b.symmetric_difference(a)
{1, 2, 5}

참고 : a.symmetric_difference(b) == b.symmetric_difference(a)

부분 집합 및 상위 집합

c.issubset(a) 의 각 요소의 여부 시험 c 인 . a

a.issuperset(c) 의 각 요소의 여부 시험 c 인 . a

>>> c = {1, 2}
>>> c.issubset(a)
True
>>> a.issuperset(c)
True

후자의 연산은 아래와 같이 동등한 연산자를가집니다.

방법 운영자
a.intersection(b) a & b
a.union(b) a | b
a.difference(b) a - b
a.symmetric_difference(b) a ^ b
a.issubset(b) a <= b
a.issuperset(b) a >= b

분리 세트

설정 와 a d 에는 요소 경우 연결되지 않은 있습니다 a 도없는 d 와 그 반대의 경우도 마찬가지입니다.

>>> d = {5, 6}
>>> a.isdisjoint(b) # {2, 3, 4} are in both sets
False
>>> a.isdisjoint(d)
True

# This is an equivalent check, but less efficient
>>> len(a & d) == 0
True

# This is even less efficient
>>> a & d == set()
True

회원 테스트하기

내장 in 차례 나오는에 대한 키워드 검색

>>> 1 in a
True
>>> 6 in a
False

길이

내장 len() 함수는 집합의 요소 수를 반환합니다.

>>> len(a)
4
>>> len(b)
3

세트 세트

{{1,2}, {3,4}}

으로 이끌다:

TypeError: unhashable type: 'set'

대신, frozenset 사용하십시오.

{frozenset({1, 2}), frozenset({3, 4})}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow