TIL25. Python : Comparison of Sequence Data Types
📌 이 포스팅에서는 Python의 Set 과 Dictionary 의 차이, List 와 Tuple 의 차이에 대해서 정리하였습니다.
🌈 Comparison of Sequence Data Types
🔥 Set 과 Dictionary의 차이
🔥 List 와 Tuple의 차이
1. Set 과 Dictionary의 차이
🤔 {}을 쓰는 두 친구
✔️ dict형과 set형 모두 {}으로 감싸져 있지만, 내부구조는 dict형은 key와 value로 이뤄져있고, set은 중복되지 않은 값으로 이루어져있습니다.
✔️ 단, dict형은 key를 중복시킬 수 없지만 value는 중복이 가능합니다.
✔️ dict형은 구조적으로 다양한 자료형은 보관할 때 사용하고, set은 교집합, 차집합, 합집합 등의 집합 처리가 필요할 때 주로 사용합니다.
a = {'name':'Kim', 'phone':'010-7777-7777', 'birth':890303} b = {0:'Hello Python', 1:'Hello Coding'} c = {'arr':[1,2,3,4,5]} print(type(a), a) # <class 'dict'> {'name': 'Kim', 'phone': '010-7777-7777', 'birth': 890303} print(a['name']) # Kim print(a.get('name')) # Kim print(a.get('address')) # None print(c['arr'][1:2]) # [2]
a = set() b = set([1,2,3,4]) c = set([1,4,5,6,6,4,5,6,1]) print(a) # set() print(b) # {1, 2, 3, 4} print(c) # {1, 4, 5, 6} t = tuple(b) l = list(c) print(t) # (1, 2, 3, 4) print(l) # [1, 4, 5, 6] s1 = set([1,2,3,4,5,6]) s2 = set([4,5,6,7,8,9]) # 교집합 print(s1.intersection(s2)) # {4, 5, 6} print(s1 & s2) # {4, 5, 6} # 합집합 print(s1.union(s2)) # {1, 2, 3, 4, 5, 6, 7, 8, 9} print(s1 | s2) # {1, 2, 3, 4, 5, 6, 7, 8, 9} # 차집합 print(s1.difference(s2)) # {1, 2, 3} print(s1 - s2) # {1, 2, 3}
2. List 와 Tuple의 차이
🤔 대괄호는 list, 소괄호는 tuple
✔️ list와 tuple은 순서가 있고, 중복 가능이 가능하다는 공통점이 있으나, list는 수정과 삭제가 가능하지만, tuple은 수정 불가, 삭제 불가능합니다.
✔️ 이에 list는 가변형 자료 구조이고, tuple은 대표적인 불변형 자료 구조입니다.
a = [] b = list() c = [1, 2, 3, 4, 5] d = [10, 100, 'Pen', 'Banana', 'Orange'] e = [10, 100, ['Pen', 'Banana', 'Orange']]
a = () b = (1,) c = (1,2,3,4) d = (10, 100, ('a', 'b', 'c')) print(a,b,c) # () (1,) (1, 2, 3, 4) print(d) # (10, 100, ('a', 'b', 'c')) print(c[2]) # 3 print(c[3]) # 4 print(d[2][2]) # c print(d[2:]) # (('a', 'b', 'c'),) print(d[2][0:2]) # ('a', 'b') print(c+d) # (1, 2, 3, 4, 10, 100, ('a', 'b', 'c'))
🤔 tuple은 tuple 내의 원소가 동일하다면, 같은 객체입니다.
✔️ tuple은 불변형이기 때문에 어차피 값의 수정이 발생되면 다른 객체입니다. 이 특징을 통해 효율성을 최적화시키기 위한 방법으로 원소값들이 일치하면 같은 객체입니다.
t1 = (1, "재원", "python") t2 = (1, "재원", "python") print(t1, t2) # (1, '재원', 'python') (1, '재원', 'python') print(t1 == t2) # True print(id(t1), id(t2)) # 140294662918656 140294662918656 print(t1 is t2) # True
🤔 list는 list 내의 원소가 동일하더라도, 독립적인 객체입니다.
✔️ 아래 2개의 list는 같은 원소를 가지고 있기 때문에 값을 비교하면 True가 반환되지만, 같은 객체인지 id값을 확인하면 False를 반환합니다.
l1 = [1, "재원", "python"] l2 = [1, "재원", "python"] print(l1, l2) # [1, '재원', 'python'] [1, '재원', 'python'] print(l1 == l2) # True print(id(l1), id(l2)) # 140368827609408 140368829161024 print(l1 is l2) # False
🤔 객체 참조에 있어서 list, tuple의 차이
✔️ 함수의 parameter로 list와 tuple이 전달될 때 어떤 차이가 있는지 살펴보겠습니다.
def plus(x, y): x += y return x
✔️ tuple은 불변형이기 때문에 수정이 발생되면 새로운 객체로 반환됩니다. 즉 새로운 객체이기 때문에 id값이 기존과 같지 않습니다.
✔️ 즉, 할당연산자를 사용했으나 할당의 개념이 아님 재탄생으로 보는게 맞습니다.
t1 = (10, 100) t2 = (5, 10) print(plus(t1, t2), t1, t2) # (10, 100, 5, 10) (10, 100) (5, 10) print(id(plus(t1, t2)), id(t1), id(t2)) # 140515106090816 140515106054848 140515127551168
✔️ list는 가변형이기 때문에 l1의 id값에 할당연산자를 사용해서 수정이 이뤄질 때, 기존 id값에 덮어씌어지기 때문에 원본의 값도 변경됩니다.
✔️ 이에 원본의 수정을 원치않으면 tuple, 수정되도 상관없으면 list를 사용하는 것을 고려해야합니다.
✔️
l1 = [10, 100] l2 = [5, 10] print(plus(l1, l2), l1, l2) # [10, 100, 5, 10] [10, 100, 5, 10] [5, 10] print(id(plus(l1, l2)), id(l1), id(l2)) # 140714272038400 140714272038400 140714272038592
Author And Source
이 문제에 관하여(TIL25. Python : Comparison of Sequence Data Types), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jewon119/TIL25.-Python-Sequence-Data-Type저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)