레이블이 sequence인 게시물을 표시합니다. 모든 게시물 표시
레이블이 sequence인 게시물을 표시합니다. 모든 게시물 표시

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 예외가 발생한다.
➌ 요소의 순서를 역순으로 바꾼다. ( 역순으로 바뀐 객체가 반환되는 것이 아니다.)