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