TIL25. Python : Comparison of Sequence Data Types

23911 단어 pythonpython

📌 이 포스팅에서는 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

좋은 웹페이지 즐겨찾기