0%

파이썬 자료구조와 알고리즘 - 내장 시퀀스 타입 (1)

이 챕터에서는 파이썬 내장 시퀀스 타입을 살펴본다.

시퀀스 타입은 멤버쉽 연산(in 키워드), 크기 함수(len()), 슬라이싱(value[:-1]), 반복성 을 가진다.

파이선에서는 문자열, 튜플, 리스트, 바이트 배열, 바이트 5개의 내장 시퀀스 타입이 있다.

깊은 복사와 슬라이싱 연산

가변 객체

  • 파이썬에서 불변 객체로는 숫자, 튜플, 문자열, 바이트 가 있다. 가변 객체로는 리스트, 바이트 배열 등이 있다.

파이썬의 모든 변수는 객체 참조를 한다. 즉, 가변 객체를 복사할 때는 매우 주의해야 한다.

1
2
3
4
5
6
7
8
9
10
11
a = [1, 2, 3]
b = a
print(a)
Out : [1, 2, 3]
print(b)
Out : [1, 2, 3]
b[1] = 7
print(a)
Out : [1, 7, 3]
print(b)
Out : [1, 7, 3]

위의 코드에서, b 변수가 가리키는 값을 변경했는데, a가 가리키는 리스트의 값도 바뀌는 것을 볼 수 있다. 이는 가변 객체에 할당된 변수의 값은 객체의 위치를 담고 있기 때문이다. 즉 b = a 를 수행하면 b에는 a 가 가리키는 위치가 할당되게 되고, b와 a는 같은 곳을 가리키게 된다.

깊은 복사

  • 리스트, 셋, 딕셔너리의 깊은 복사는 다음과 같이 할 수 있다.
1
2
3
4
5
6
7
8
9
# 리스트의 깊은 복사
mylist = [1, 2, 3]
newlist1 = mylist[:]
newlist2 = list(mylist)
# 셋, 딕셔너리의 복사
myset = {1, 2, 3}
newset = myset.copy()
mydict = {1:1, 2:2}
newdict = mydict.copy()

만약 가변 객체에 가변 객체가 들어있는 형태, 예를 들어,

a = [1,[1,2,3]]
이런 형태라면, 안쪽의 가변 객체까지 완전히 복사해주는 메서드를 사용해야 한다.

1
2
3
import copy
a = [1, [1,2,3]]
b = copy.deepcopy(a)

문자열

파이썬에서 모든 문자열은 유니코드이다.

문자열 메서드

join()

  • 리스트에 있는 모든 값을 하나의 단일 문자열로 결합하는 메서드
1
2
3
4
5
6
7
8
a = ['a', 'b', 'c']
# 앞의 문자열은 리스트의 아이템 간에 추가할 문자열이다.
b = "".join(a)
print(b)
Out : "abc"
b = "!".join(a)
print(b)
Out : "a!b!c"

split()

  • 문자열의 값을 리스트로 분리해서 반환
1
2
3
4
a = "a!b!c"
b = a.split("1")
print(b)
Out : ["a", "b", "c"]

index(), find()

  • A.index(sub, start, end)
    • start - end 범위에서 sub의 인덱스를 찾아 반환
    • 실패시 ValueError 예외 발생
  • A.find(sub, start, end)
    • start - end 범위에서 sub의 인덱스를 찾아 반환
    • 실패시 -1 반환

다음 포스트에서는 튜플, 리스트, 바이트와 바이트 배열에 대해 정리할 것이다.