나열형(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 예외가 발생한다.

➌ 요소의 순서를 역순으로 바꾼다. ( 역순으로 바뀐 객체가 반환되는 것이 아니다.)



Posted by 살레시오
,