파이썬 set

Yeonu·2020년 11월 20일
0

Python 이론

목록 보기
13/30
post-thumbnail
post-custom-banner

세트(set)

세트 = {값1, 값2, 값3}
파이썬은 집합을 표현하는 세트(set)라는 자료형을 제공한다. 수학에서 배우는 그 집합이다. 세트는 합집합, 교집합, 차집합 등의 연산이 가능하다.

>>> fruits = {'strawberry', 'grape', 'orange', 'pineapple', 'cherry'}
>>> fruits
{'pineapple', 'orange', 'grape', 'strawberry', 'cherry'}

세트는 중복되는 값이 있더라도 하나만 보여주며 출력할 때마다 요소 순서가 랜덤이다. 리스트 튜플, 딕셔너리와 달리 [ ]로 특정 요소만 출력할 수 없다.



세트에 특정 값이 있는지 확인하기

in, not in 연산자를 사용한다.



set를 사용하여 세트 만들기

set(반복가능한객체)

>>> a = set('apple')    # 유일한 문자만 세트로 만듦
>>> a
{'e', 'l', 'a', 'p'}

  >>> b = set(range(5))
>>> b
{0, 1, 2, 3, 4}

>>> c = set() # set출력시 요소는 {}되지만 생성은 ()다! {}로 하면 딕셔너리가 만들어짐
>>> c
set()



frozenset

내용을 변경할 수 없는 세트다.
세트는 리스트나 딕셔너리와 달리 세트 안에 세트를 넣을 수 없다.
frozenset는 세트 안에 세트를 넣고 싶을 때 사용한다. frozenset는 frozenset를 중첩해서 넣을 수 있다. 단, frozenset만 넣을 수 있고, 일반 set는 넣을 수 없다.

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



집합 연산 이용하기

  1. OR 연산자 |는 합집합(union)을 구한다. set.union 메서드와 동작이 같다.
    세트1 | 세트2
    set.union(세트1, 세트2
  2. AND 연산자 &는 교집합(intersection)을 구한다. set.intersection 메서드와 동작이 같다.
    세트1 & 세트2
    set.intersection(세트1, 세트2)
  3. 뺄셈 연산자 -는 차집합(difference)을 구한다. set.difference 메서드와 동작이 같다.
    세트1 - 세트2
    set.difference(세트1, 세트2)
  4. XOR 연산자 ^는 대칭차집합(symmetric difference)을 구한다. set.symmetric_difference 메서드와 동작이 같다.
    세트1 ^ 세트2
    set.symmetric_difference(세트1, 세트2)



집합 연산 후 할당 연산자 사용하기

세트 자료형에 |, &, -, ^ 연산자와 할당 연산자 =을 함께 사용하면 집합 연산의 결과를 변수에 다시 저장(할당)한다.

  1. |=은 현재 세트에 다른 세트를 더하며 update 메서드와 같다.
    세트1 |= 세트2
    세트1.update(세트2)

    >>> a = {1, 2, 3, 4}
    >>> a |= {5}
    >>> a
    {1, 2, 3, 4, 5}
    >>> a = {1, 2, 3, 4}
    >>> a.update({5})
    >>> a
    {1, 2, 3, 4, 5}
  2. &=은 현재 세트와 다른 세트 중에서 겹치는 요소만 현재 세트에 저장하며 intersection_update 메서드와 같다.

    >>> a = {1, 2, 3, 4}
    >>> a &= {0, 1, 2, 3, 4}
    >>> a
    {1, 2, 3, 4}
    >>> a = {1, 2, 3, 4}
    >>> a.intersection_update({0, 1, 2, 3, 4})
    >>> a
    {1, 2, 3, 4}
  3. -=은 현재 세트에서 다른 세트를 빼며 difference_update 메서드와 같다.

    >>> a = {1, 2, 3, 4}
    >>> a -= {3}
    >>> a
    {1, 2, 4}
    >>> a = {1, 2, 3, 4}
    >>> a.difference_update({3})
    >>> a
    {1, 2, 4}
  4. ^=은 현재 세트와 다른 세트 중에서 겹치지 않는 요소만 현재 세트에 저장하며 symmetric_difference_update 메서드와 같다.

    >>> a = {1, 2, 3, 4}
    >>> a ^= {3, 4, 5, 6}
    >>> a
    {1, 2, 5, 6}
    >>> a = {1, 2, 3, 4}
    >>> a.symmetric_difference_update({3, 4, 5, 6})
    >>> a
    {1, 2, 5, 6}



부분 집합과 상위집합 확인하기

세트는 부분집합, 진부분집합, 상위집합, 진상위집합과 같이 속하는 관계를 표현할 수도 있다. 이를 확인할 때 세트 자료형에 부등호와 등호 사용한다.

  1. <=은 현재 세트가 다른 세트의 부분집합(subset)인지 확인하며 issubset 메서드와 같다.
    현재세트 <= 다른세트
    현재세트.issubset(다른세트)
    >>> a = {1, 2, 3, 4}
    >>> a <= {1, 2, 3, 4}
    True
    >>> a.issubset({1, 2, 3, 4, 5})
    True
  2. <은 현재 세트가 다른 세트의 진부분집합(proper subset)인지 확인하며 메서드는 없다.
    >>> a = {1, 2, 3, 4}
    >>> a < {1, 2, 3, 4, 5}
    True

3.>=은 현재 세트가 다른 세트의 상위집합(superset)인지 확인하며 issuperset 메서드와 같다.
현재세트 >= 다른세트
현재세트.issuperset(다른세트)

4.>은 현재 세트가 다른 세트의 진상위집합(proper superset)인지 확인하며 메서드는 없다.



세트가 같은지 다른지 확인하기

==. != 연산자를 사용한다.

세트가 겹치지 않는지 확인하기

disjoint를 사용한다.
현재세트.isdisjoint(다른세트)

>>> a = {1, 2, 3, 4}
>>> a.isdisjoint({5, 6, 7, 8})       # 겹치는 요소가 없음
True
>>> a.isdisjoint({3, 4, 5, 6})    # a와 3, 4가 겹침
False



세트에 요소 추가하기

add(요소)

세트에 특정 요소 삭제하기

remove(요소), discard(요소)
discard()는 해당 요소가 없을 경우 에러 없이 그냥 넘어간다.

세트에서 임의의 요소 삭제하기

.pop()
만약 요소가 없을 경우(세트가 비었을 때) 에러를 발생시킨다.

세트의 모든 요소 삭제하기

.clear()

세트의 요소 개수 구하기

len(세트)


세트의 할당과 복사

할당하면 같은 객체를 참조한다.
.copy() 하면 완전히 복사되어 한쪽을 변경해도 나머지에 반영되지 않는다.


반복문으로 세트의 요소 모두 출력하기

for문으로 돌리면 된다. 세트의 요소는 자리가 랜덤으로 출력되기 때문에 출력할 때마다 순서가 바뀐다.
바로 세트를 만들어 for문에 사용해도 된다.

for i in {1, 2, 3, 4}:
    print(i)



세트 표현식(comprehension) 사용하기

{식 for 변수 in 반복가능한객체}
set(식 for 변수 in 반복가능한객체)

>>> a = {i for i in 'apple'}
>>> a
{'l', 'p', 'e', 'a'} #세트는 문자열 순서 랜덤

세트 표현식(comprehension)에 if문 사용하기

>>> a = {i for i in 'pineapple' if i not in 'apl'}
>>> a
{'e', 'i', 'n'} #조건문에 지정된 문자가 빠지고 중복값은 하나만 존재



@심사문제 26.9

  1. 문제를 잘 읽자! 입력받은 두 수의 공약수를 구하는 문제 -> range를 1부터 돌려야됨
  2. n의 약수 -> n % i == 0
    n의 배수 -> i % n == 0
  3. 습관적으로 list(map(..)) 사용했는데(출력에는 문제 없음) 생각하고 필요할 때만 쓰기
 n,m=map(int,input().split())
a={i for i in range(1,m+1) if n % i == 0}
b={i for i in range(1,m+1) if m % i == 0}

divisor = a & b
 
result = 0
if type(divisor) == set:
    result = sum(divisor)
 
print(result)
post-custom-banner

0개의 댓글