2015년 5월 25일 월요일

파이썬의 나열형(sequence)

 나열형(sequence)은 데이터들의 집합이며 기본적인 나열형 객체는 list, tuple, range 등이다. str형과 bytes형, bytearray 등도 나열형에 속한다. (나열형은 기본적으로 iterable 이다.)

[표 1] 대표적인 가변(mutable) 불변(immutable) 나열형
mutable 시퀀스
immutable 시퀀스
list, bytes, bytearray
str, tuple, range

 다음 표는 가변/불변 나열형 객체에서 지원하는 연산을 우선 순위 차례로 나열한 것이다. x는 임의의 객체이고 s, s1, s2는 나열형 객체들을 표기한다. n, i, j, k는 정수이다.

[표 2] 나열형의 기본 연산의 종류
연산
결과
x in s
x not in s
s의 한 요소가 x와 같다면 True
s의 한 요소가 x와 같다면 False
s1 + s2
s*n 혹은 n*s
두 시퀀스를 결합한다.
시퀀스를 n번 반복한다.
(immutable 시퀀스의 경우 항상 새로운 시퀀스를 생성한다.)
s[i]
i번째 요소 (0부터 시작)
s[i:j]
i번째 부터 j-1번째 요소까지의 슬라이스
s[i:j:k]
i번째 부터 j-1번째 요소까지의(k는 스텝) 슬라이스
len(s)
요소의 개수
min(s)
가장 작은 요소
max(s)
가장 큰 요소
s.index(x[, i[, j]])
x와 같은 첫 번째 요소의 인덱스
s.count(x)
x와 같은 요소들의 개수

같은 형의 나열형 객체끼리는 비교도 가능하다. 특히 리스트와 튜플은 길이와 같은 인덱스를 가지는 모든 요소들끼리 같다면 두 리스트/튜플은 같은 것으로 판별된다.

>>> ‘gg’ in ‘eggs’
True

 나열형 객체의 복사는 ‘얕은 복사’라는 것도 유의해야 한다. 즉, 중첩된 구조는 복사되지 않는다.

>>> lst=[ [] ]*3
>>> lst
[[], [], []]
>>> lst[0].append(1)
>>> lst
[[1], [1], [1]]

이 예제는 곱(*) 복사가 ‘얕은 복사’이기 때문에 원래의 빈 리스트의 참조를 복사해서 붙임을 알 수 있다. 따라서 하나가 변하면 다른 것들도 변한다. 같은 참조를 가지기 때문이다.

서로 다른 리스트를 만들려면 다음과 같이 하면 된다.

lst = [ [] for _ in range(3)]
>>> lst
[[], [], []]
>>> lst[0].append(1)
>>> lst[1].append(2)
>>> lst[2].append(3)
>>> lst
[[1], [2], [3]]

만약 ‘깊은 복사’를 수행하려면 copy 모듈의 deepcopy 함수를 이용하면 된다.

>>> x=[11,22]
>>> y=[x, 33]
>>> y
[[11, 22], 33]
>>> from copy import deepcopy
>>> z = deepcopy(y)
>>> z
[[11, 22], 33]
>>> x[0]=-44
>>> y
[[-44, 22], 33] #x가 변하면 y도 변한다.
>>> z
[[11, 22], 33] # x가 변해도 z는 변함이 없다.

 가변 나열형 객체의 경우 다음과 같은 조작이 추가로 가능하다.

[표 3] 가변 나열형 객체의 조작
연산
결과
s[i] = x
s의 i번째 요소를 x로 교체
s[i:j] = t
i번째 요소부터 j-1번째 요소를 t(iterable)로 교체
del s[i:j]
i번째 요소부터 j-1번째 요소를 삭제 ( s[i:j] = [] 와 동일)
s[i:j:k] = t
i번째 요소부터 j-1번째 요소(k는 스텝)를 t(iterable)로 교체 ➊
del s[i:j:k]
i번째 요소부터 j-1번째 요소(k는 스텝)를 삭제
s.append(x)
s의 마지막 요소로 x를 삽입
s.extend(t)
t의 내용물로 s를 확장 ( s[len(s):len(s)]=t 와 동일)
s.insert(i, x)
i 번째에 x를 삽입
s.pop()
s.pop(i)
마지막 삭제하고 그것을 반환한다.
i 번째 요소를 삭제하고 그것을 반환한다.
s.remove(x)
s의 요소 중 x와 같은 첫 번째 것을 제거 ➋
s.reverse()
요소들을 역순으로 배열한다. ➌
s.clear()
모든 요소 삭제 (del s[:] 과 동일) ver3.3부터 도입
s.copy()
얕은 복사본 생성 (s[:] 와 동일) ver3.3부터 도입

➊ t 와 슬라이싱 된 요소들의 크기가 같아야 한다.
➋ s 안에 x가 없다면 ValueError 예외가 발생한다.
➌ 요소의 순서를 역순으로 바꾼다. ( 역순으로 바뀐 객체가 반환되는 것이 아니다.)

댓글 없음:

댓글 쓰기