Python

6. 비시퀀스형 자료구조의 메서드(method)

개발자 뭄뭄 2022. 8. 1. 00:31
반응형

비시퀀스형 자료구조

1. 셋(set)

변경할 수 있고(mutable), 순서가 없고(unordered), 순회 가능한(iterable)

dir(set) 을 사용하여, set 에서 사용가능한 method를 확인 가능하다.

s.copy()
s.add(x)
s.pop() # 나다 싶으면 나가라~. 랜덤하게 항목을 반환하고 해당 항목을 제거한다.
s.remove(x) # 항목 x를 삭제. x 가 없는 경우 에러난다.
s.discard(x) # remove와 비슷하지만 에러 x

s.update(t) 셋 t에 있는 모든 항목 중에 셋s에 없는 항목을 추가
s.clear()

값의 추가 및 삭제
# 추가
a = {'사과', '바나나', '수박'}
a.add('금귤') # add는 요소 1개만 가능하다.
print(a) # {'금귤', '바나나', '사과', '수박'}

a.update(['딸기', '바나나', '무화과']) # update 안에는 iterable 한 요소 (list도가능)
# a.update({'토마토', '토마토', '딸기'},['포도', '레몬']) -> 가능!

print(a) # {'금귤', '무화과', '수박', '바나나', '딸기', '사과'}


# 삭제
a.remove('애플망고')
print(a) # error

a.discard('애플망고')
print(a) # {'바나나', '사과', '무화과', '금귤', '딸기', '수박'}
# remove 와 다르게 없어도 에러가 안난다.


a.pop()
print(a) # {'사과', '바나나', '금귤', '무화과', '수박'} 랜덤으로 삭제되는 모습!
set만이 가지는 특별한 method
# 셋이 갖는 특별한 메소드
s.isdisjoint(t) # 서로소인 경우 True 반환
s.issubset(t) # s < t인 경우. 즉 s가 t의 하위 셋인 경우 True
s.isupserset(t) # t < s 인경우

2. 딕셔너리(dictionary)

변경할 수 있고(mutable), 순서가 없고(unordered), 순회 가능한(iterable)

d.keys()
d.values()
d.items()

d.get() # 조회시 없는 경우, None을 반환한다.
d.get(k,v) # k를 조회하고 없으면 v를 반환한다.

d.pop()
값의 추가 및 삭제
a = {'apple':'사과', 'banana':'바나나', 'watermelon':'수박'}
print(a.get('pineapple')) # None (default)
print(a.get('pineapple', 0)) # 0 default 값을 출력할 수 있다.

# 만약 출력 뿐만이 아니라, key가 없을 때 추가하고 싶다면?
a.setdefault('pineapple', "파인애플") # 을 사용한다면,
	print(a) # a = {'apple':'사과', 'banana':'바나나', 'watermelon':'수박', 'pineapple' : '파인애플'}

print(a['apple']) # 사과
print(a['pineapple']) #에러 get은 에러를 뜨지 않기 위해서 사용한다.


data = a.pop('apple') # key값을 pop에 넣는다. apple이 없는 경우 에러난다. 
print(data, a) 사과 {'banana': '바나나', 'watermelon': '수박'}

data = a.pop('pineapple', 0) # 이렇게 없는 경우 대신 반환할 값을 넣어줘도 된다.
print(data, a) # 0 {'banana': '바나나', 'watermelon': '수박'}

a.update(무화과='fig') # key에 들어갈 값은 '' 없이 그냥 문자열로 작성한다.
print(a) # {'banana': '바나나', 'watermelon': '수박', '무화과': 'fig'}

3. 얕은 복사와 깊은 복사 (Shallow Copy & Deep Copy)

  • 복사방법 : 할당, 얕은 복사, 깊은 복사

  • immutable ( 변경 불가능) : 숫자, 글자, 참 거짓, range, tuple, frozenset

    → 우리눙 남남이야!

  • mutable( 변경 가능) : set, dictionary, list

    → 야아~~ 우리 같이 share 하자~~. 우리 id값이 같아 칭긔칭긔~

  1. 할당

    대입 연산자(=) 를 통한 복사는 해당 객체에 대한 객체 참조를 복사.

    야~ 우리둘이 주소 같이 쓰자~~ 가 되버린다.

  1. 얕은 복사

    slice 연산자를 활용/list 함수를 사용

    original_list = ['안녕', '정뭄뭄']
    print(id(original_list)) #1888430840320
    
    new_list = original_list
    print(id(new_list)) #1888430840320
    
    duplicate_list = original_list[:]
    print(id(duplicate_list)) #1888430917248
    a = [1, 2, 3]
    
    b = a[:]
    b[0] = 5
    print(a, b) # [1, 2, 3] [5, 2, 3]
    
    
    b = list(a)
    b[0] = 5
    print(a, b) # [1, 2, 3] [5, 2, 3]

    ⚠️1차원에서만 가능하다. 2차원 (list안에 있는 list)는 주소를 공유해버림~~

    → 결론! 깊은 복사 (Deep copy) 를 사용하자~

    a = [1, 2, [1, 2]]
    b = a[:]
    print(id(a[2])) # 2497165155840
    print(id(b[2])) # 2497165155840

  1. 깊은 복사

    알고리즘에서 종종쓰인다. 헷갈리니까! 꼭 기억해두고. 활용하자!!

import copy

a = [1, 2, [4, 5]]
b = copy.deepcopy(a)
b[2][0] = 0

print(a, b) # [1, 2, [4, 5]] [1, 2, [0, 5]]


Uploaded by N2T

반응형