반응형

I.시퀀스 자료형

요소(elements)가 연속적으로 나열되어 있는 모든 자료형

* 시퀀스 자료형은 모두 인덱스 컨트롤, 슬라이싱 등 공통의 기능을 수행할 수 있습니다.

1) 컨테이너형(Container datatypes) : 서로 다른 자료형을 담을 수 있다.
ex.) list, tuple, colletions의 deque, namedtuple, orderdict, counter, defaultdict 등
2) 플랫형(Flat datatypes) : 단일 자료형만 담을 수 있다.
ex.) str, int, bytes, bytearray, array.array, numpy.ndarray

1. List

  • tuple, dict와 함께 정말 많이 쓰는 자료형 중 하나
  • 수정 가능(mutable) = not hashable

1) list 생성

value = '12345678'

list1 = []
for v in value : 
    list1.append(v)
>>> [1, 2, 3, 4, 5, 6, 7, 8]

list2 = [int(v) for v in value]
>>> [1, 2, 3, 4, 5, 6, 7, 8]

리스트 선언 시 대괄호[]를 사용하며, 빈 리스트를 만들어서 값을 추가하거나 Comprehension을 이용

list3 = [int(v) for v in value if int(v) > 3]
>>> [4, 5, 6, 7, 8]

list4 = list(filter(lambda x : x > 3, map(int,value))
>>> [4, 5, 6, 7, 8]

filtering이나 조건문도 사용 가능합니다.

 

2) 주의사항

#예 1

ex1 = [['a'] * 3 for _ in range(3)] 
ex2 = [['a'] * 3 ] * 3 
>>> [['a', 'a', 'a'], ['a', 'a', 'a'], ['a', 'a', 'a']]

ex1[0][1] = 'b'
>>> [['a', 'b', 'a'], ['a', 'a', 'a'], ['a', 'a', 'a']]

ex2[0][1] = 'b'
>>> [['a', 'b', 'a'], ['a', 'b', 'a'], ['a', 'b', 'a']]
# 예 2

del ex1[0][1]
>>> [['a', 'a'], ['a', 'a', 'a'], ['a', 'a', 'a']]

del ex2[0][1]
>>> [['a', 'a'], ['a', 'a'], ['a', 'a']]
# 서로 다른 id
print([id(i) for i in ex1])
>>> [4339804272, 4339804192, 4339804112]

# id가 모두 동일
print([id(i) for i in ex2])
>>> [4339803952, 4339803952, 4339803952]

ex1, ex2를 출력하면 결과는 모두 동일하지만, 수정하거나 삭제한 다음 결과는 완전히 다른 모습을 보여줍니다.

ex1 은 ['a', 'a', 'a'] 3개가 각각 개별 요소로 취급받지만, ex2는 copy 된 상태이기 때문에 동일 요소로 취급받기 때문입니다.

2. tuple

  • tuple, dict와 함께 정말 많이 쓰는 자료형 중 하나

  • 수정 가능(immutable) = hashable

tuple1 = (1,2,3)
tuple2 = 1, 2, 3

tuple 선언은 괄호()를 이용하며, 괄호를 사용하지 않아도 튜플로 인식하지만 명시적으로 표현하기 위해 괄호를 꼭 붙이는 게 좋습니다. 

 

II. Hash

  • 1개의 key에 1개의 value를 저장하는 구조
  • 파이썬 엔진 자체가 해시로 구성
  • hash는 immutable 한 경우만 가능 ( immutable한 객체여도 내부 요소가 mutable 할 경우 hash X )

hash의 가장 큰 장점은 어떤 행동을 취하던 key에 대응한 value에 직접 접근이 가능하다는 점입니다. 대표적인 hashtable로는 dict, set, orderdict 등이 있습니다.


c.f) unpacking
*을 사용하여 unpacking이 가능한데, 이를 이용해 튜플과 리스트를 효과적으로 다룰 수 있습니다.

a, b, c = range(10)
>>> raise error

a, b, *c = range(10)
>>> 0 1 [2, 3, 4, 5, 6, 7, 8, 9]

첫 번째 경우는 0 ~ 9까지의 값을 모두 할당할 수 없어 에러가 발생하지만 두 번째 경우에는 리스트 형태로 할당됩니다.

ex1 = (a,b,c)
>>> (0, 1, [2, 3, 4, 5, 6, 7, 8, 9])

ex2 = (a,b,tuple(c))
>>> (0, 1, (2, 3, 4, 5, 6, 7, 8, 9))

ex1[2][0] = 100
>> (0, 1, [100, 3, 4, 5, 6, 7, 8, 9])

ex2[2][0] = 100
>> raise error

a, b, c로 각각 튜플을 만드는데 ex1은 리스트를 그대로, ex2는 튜플로 변환하였습니다. 이렇게 만들 경우 ex1 내부의 리스트는 mutable 하기 때문에 ex1은 튜플이지만 mutable 한 상태가 됩니다.

hash(ex1)
>>> raise error

hash(ex2)
>>> 8121315492147364223

따라서 ex1은 튜플 타입임에도 not hashable 하다는 것을 알 수 있습니다.

 

 

ref 1. python 3.7 공식문서

ref 2. 인프런___우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)

반응형
복사했습니다!