When will you grow up?

파이썬 시퀀스(python sequence)_05 본문

02. Study/Python

파이썬 시퀀스(python sequence)_05

미카이 2022. 3. 22. 15:16

시퀀스(sequence) 타입이란 순서가 있는 데이터 집합인데, 파이썬에서는 대표적으로 리스트(list)가 있다.

그 중, 수정 가능한 mutable(가변)형 및 수정 불가능한 immutable(불변)형이 있다.

mutable(list, bytearray, array.array, memoryview, deque etc..)

immutable(tuple, str, bytes etc..)

또한, 파이썬에서는 크게 2가지 종류의 데이터 타입으로 나뉜다.

컨테이너(container:서로 다른 자료형 담을 수 있는 데이터 타입) -> list, tuple, collections.deque etc...

플랫(flat: 한개의 자료형만 담을 수 있는 데이터 타입) -> str, bytes, bytearray, array.array, memoryview etc...

 

 

그렇다면 이제 리스트 심화? 파이써닉하게 리스트를 만드는 방법을 알아보자.

다음 예제는 문자 -> 유니코드로 변환 하고 다시 유니코드 -> 문자로 변경하는 실습을 해보자.

1
2
3
4
5
6
7
chars = '+_)(*&^%$#@!'
# str는 불변이라 chars[2] = 's' 이렇게 변경 불가! 왜냐면 불변형이기 때문에!
 
code_list1 = []
for s in chars:
   code_list1.append(ord(s)) # ord() 문자를 유니코드로 변경
print(code_list1)
cs

만약 우리가 리스트를 이용해 작성했다고 가정 하면 위와 같이 작성했을 것이다.

 

하지만 속도면에서도 훨씬 빠른 list comprehending을 이용하면 쉽고 빠르게 작성할 수 있다.

1
code_list2 = [ord(s) for s in chars] # 한줄로도 이렇게 표현 가능하다.
cs

 

다시 유니코드로 돌리려면 chr() 메소드를 이용하면 다시 돌릴 수 있다.

1
2
3
4
5
code_list3 = [ord(s) for s in chars if ord(s) > 40]
print(code_list3)
code_list4 = list(filter(lambda x : x > 40, map(ord, chars)))
print(code_list4)
print([chr(s) for s in code_list1]) # ord 반대로 / 유니코드를 문자로 바꿔줌
cs

 

마지막으로 리스트 사용시 주의할 점을 알아보자.

깊은 복사(deep copy), 얕은 복사(shallow copy)

깊은 복사는 새로운 소주에 값을 할당하여 값을 변경 해도 다른 객체이기 때문에 변경하면 이전 객체는 변경되지 않는 반면, 얕은 복사는 값을 수정하면  값이 참조하고있기에 변경된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
marks1 = [['~'* 3 for _ in range(4)]
print(marks1)
 
marks2 = [['~']*3* 4  # 이렇게 만들어도 결과는 똑같지만, 수정시 문제가 된다
print(marks2)
 
# 수정
marks1[0][1= 'X'
marks2[0][1= 'X'
print(marks1)
print(marks2) # 이렇게 수정하면 각 리스트별 2번째 원소가 다 바뀐다. [['~', 'X', '~'], ['~', 'X', '~'], ['~', 'X', '~'], ['~', 'X', '~']]
 
# 왜 이런일이 일어났나면 첫번째(marks1)는 정확하게 다 복사가 됐기 때문에 모두 다 다른 주소를 가지고있는 반면,
# 두번째(marks2)는 하나의 주소값이 4개가 복사가 됐기 때문에 수정이 이뤄난다.
 
# 증명
print([id(i) for i in marks1]) # 주소가 다 다른 반면
print([id(i) for i in marks2]) # 주소가 동일..
cs

 

 

 

우리를 위한 프로그래밍 : 파이썬 중급 를 기반으로 정리하였으며,

기본적인 내용보다는 실질적으로 Why? 라는 의문이 가질 법한 내용 위주로 정리하였습니다.

Comments