2.9 파이썬에서 리스트 자료형 다루기

자료의 개수

리스트 변수에 자료가 몇 개 들어가 있는지 알기 위해서는 len이라는 명령을 사용한다.

a = [1, 2, 3]
len(a)
3

수열 생성하기

0부터 n-1까지 1씩 증가하는 n개의 숫자를 가지는 수열 리스트는 range 명령으로 생성한다. 파이썬 버전 2에서는 range 명령만 쓰면 되지만 파이썬 버전 3에서는 range 명령으로 만들어진 값을 list 명령을 사용하여 명시적으로 리스트로 바꾸어야 한다.

b = list(range(10))
b
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

만약 0이 아닌 다른 수부터 증가하게 하려면 다음과 같이 range 명령에 두 개의 숫자를 넣는다. range 명령은 두 숫자 x, y 에 대해 x보다 같거나 크고(이상), y보다 작은(미만) 수열을 만든다. 즉 x는 시작값(start), y는 포함되지 않는 끝값(end) 역할을 한다.

c = list(range(1, 10))
c
[1, 2, 3, 4, 5, 6, 7, 8, 9]

만약 1씩 증가하는 것이 아니라 2 혹은 3씩 증가하는 수열을 만들고 싶다면 range 명령에 세 개의 숫자를 넣는다. 세번째 숫자는 건너 뛰기 숫자(step) 역할을 한다.

d = list(range(1, 10, 3))
d
[1, 4, 7]

값을 바꾸기

특정한 원소의 값을 다른 값으로 바꾸는 것을 갱신(update)이라고 한다. 리스트에서 특정 원소의 값을 갱신하려면 다음과 같이 인덱싱한 값에 새로운 값을 대입하면 된다.

d[0] = 100
d
[100, 4, 7]

자료 추가하기

리스트 변수의 마지막에 자료를 더 추가하려면 다음과 같이 append 메서드를 사용한다. 이 때 메서드(method)란 변수 다음에 점(.)을 찍고 쓰는 명령을 말한다.

e = list(range(4))
e
[0, 1, 2, 3]
e.append(4)
e
[0, 1, 2, 3, 4]
e.append(10)
e
[0, 1, 2, 3, 4, 10]

자료 삭제하기

리스트에서 자료를 하나 삭제하려면 다음과 같이 del 명령을 사용한다.

f = list(range(5))
f
[0, 1, 2, 3, 4]
f[0]
0
del f[0]
f
[1, 2, 3, 4]
f[2]
3
del f[2]
f
[1, 2, 4]

슬라이싱

리스트에서 자료를 하나만 가져오는 것이 아니라 특정 범위의 자료를 모두 가져오고 싶다면 슬라이싱(slicing)이라는 방법을 사용한다. 슬라이싱은 콜론(:) 기호를 사용하여 리스트의 자료 범위를 나타내는 연산이다. 예를 들어 20개의 숫자가 있는 리스트에서 앞의 5개만 가져오고 싶으면 다음과 같이 입력한다.

g = list(range(20))
g
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
g[0:5]
[0, 1, 2, 3, 4]

이 때 앞의 0이라는 숫자는 생략할 수 있다.

g[:5]
[0, 1, 2, 3, 4]

만약 11 번째에서 15번째까지의 자료라면 다음과 같다.

g[10:15]
[10, 11, 12, 13, 14]

역 인덱싱(음수 인덱싱)

음수 인덱스를 사용하면 뒤에서부터 원소를 가리키게 된다. 이때 가장 뒤의 원소는 0이 아니라 -1 이라는 인덱스를 사용한다.

g[-1]
19

음수 인덱스를 사용할 때도 슬라이싱을 할 수 있다. 두 번째 인덱스가 생략되면 끝까지를 의미한다(-1을 쓸 때와 다르다).

g[-5:-2]
[15, 16, 17]
g[-3:]
[17, 18, 19]
g[-3:-1]
[17, 18]

연습 문제 2.9.1

  1. 리스트에는 숫자 뿐 아니라 문자 등 어떤 값도 넣을 수 있다. 10명으로 이루어진 반의 학생 이름을 생각하여 리스트 변수로 만들어 본다.

  2. 전학생이 왔다고 가정하여 리스트에 이름을 추가한다.

  3. 한 명이 전학을 갔다고 가정하고 리스트에서 이름을 삭제한다.

  4. 슬라이싱으로 5번 학생(1번 학생은 가장 처음에 있는 학생이다.)부터 9번 학생까지 5명의 이름을 담은 새로운 리스트를 만든다.

복수 할당

리스트의 각 원소값을 여러개의 변수에 나누어 넣고 싶을 때는 쉼표를 사용한 복수 할당(multiple/unpack assignment)을 사용한다. 할당 기호의 왼쪽에 쉼표로 구분된 변수를 여러개 넣으면 오른쪽에 있는 리스트의 각 원소값이 들어간다.

h = [1, 2, 3]
h1, h2, h3 = h
h1
1
h2
2
h3
3

단 복수 할당을 할 때는 값이 들어갈 변수의 개수와 리스트의 길이가 같아야 한다. 그렇지 않으면 오류가 발생한다.

h1, h2 = h
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-5-78eb5c6f0f34> in <module>
----> 1 h1, h2 = h

ValueError: too many values to unpack (expected 2)