Python Language
세트
수색…
통사론
- 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__
와 일치합니다. 일반적으로 list
나 set
과 같은 변경 가능한 타입은 해시 가능하지 않으므로 세트에 넣을 수 없습니다. 이 문제가 발생하면 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부터) :
>>> from collections import Counter
>>> counterA = Counter(['a','b','b','c'])
>>> counterA
Counter({'b': 2, 'a': 1, 'c': 1})
Counter
는 요소가 사전 키로 저장되고 해당 개수가 사전 값으로 저장되는 사전입니다. 그리고 모든 사전처럼, 그것은 순서가없는 컬렉션입니다.
메소드 및 내장 함수를 사용하여 연산 설정
우리는 두 세트 a
와 b
정의한다 a
>>> a = {1, 2, 2, 3, 4}
>>> b = {3, 3, 4, 4, 5}
참고 :
{1}
은 하나의 요소 집합을 만들고{}
은 빈dict
만듭니다. 빈 세트를 만드는 올바른 방법은set()
입니다.
교차로
a.intersection(b)
는 a
와 b
둘 다에 존재하는 원소들을 가진 새로운 집합을 반환한다.
>>> a.intersection(b)
{3, 4}
노동 조합
a.union(b)
는 a
와 b
중 하나에 요소가있는 새로운 집합을 반환합니다.
>>> 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})}