비시퀀스형 자료구조
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값이 같아 칭긔칭긔~
- 할당
대입 연산자(=) 를 통한 복사는 해당 객체에 대한 객체 참조를 복사.
야~ 우리둘이 주소 같이 쓰자~~ 가 되버린다.
- 얕은 복사
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)) #1888430917248a = [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
- 깊은 복사
알고리즘에서 종종쓰인다. 헷갈리니까! 꼭 기억해두고. 활용하자!!
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