19.4 리스트의 인덱스 활용하기

이번에는 인덱스로 범위를 지정하여 리스트의 일부만 가져와보겠습니다.

  • 리스트[시작인덱스:끝인덱스]
>>>a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[0:4]
[0, 10, 20, 30]
>>> a[0:10]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

[ ] 안에 시작 인덱스와 끝 인덱스를 지정하면 해당 범위의 리스트를 가져올 수 있습니다. 이렇게 가져온 리스트는 리스트의 일부를 잘라왔다고 해서 슬라이스(slice)라고 부릅니다. 여기서 주의할 점이 있는데 끝 인덱스는 가져오려는 인덱스보다 1을 더 크게 지정해야 합니다. 따라서 요소가 10개 들어있는 리스트를 처음부터 끝까지 가져오려면 [0:9]가 아닌 [0:10]이어야 합니다(끝 인덱스는 리스트의 범위를 벗어난 인덱스를 지정할 수 있습니다).

그림 19-3 리스트 슬라이스
그림 22 3 리스트 슬라이스

다음과 같이 실행해보면 쉽게 이해할 수 있습니다. a[1:1]처럼 시작 인덱스와 끝 인덱스를 같은 숫자로 지정하면 아무것도 가져오지 않습니다. a[1:2]처럼 끝 인덱스를 1이 더 크게 지정해야 요소 하나를 가져옵니다.

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[1:1]
[]
>>> a[1:2]
[10]
그림 19-4 시작 인덱스와 끝 인덱스가 같을 때
그림 22 4 시작 인덱스와 끝 인덱스가 같을 때, 끝 인덱스가 1 많을 때

그럼 이번에는 리스트의 중간 부분을 가져와 보겠습니다.

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[4:7]
[40, 50, 60]
>>> a[4:-1]
[40, 50, 60, 70, 80]

물론 a[4:-1]과 같이 음수를 지정할 수도 있습니다. -1은 뒤에서 첫 번째 요소를 뜻하는데 끝 인덱스는 가져오려는 인덱스보다 1을 더 크게 지정한다고 했으므로 실제로는 뒤에서 두 번째(-2) 요소인 80까지만 가져옵니다(음수는 숫자가 작을 수록 큰 수입니다. 그래서 -1은 -2보다 1이 더 큽니다).

그림 19-5 리스트 중간만 가져오기
그림 22 5 리스트 중간만 가져오기

이번에는 인덱스를 생략하는 방법을 사용해보겠습니다. 인덱스를 생략하는 방법은 리스트의 길이를 몰라도 되기 때문에 자주 쓰이는 방식입니다. 주로 리스트의 마지막 일부분만 출력할 때 사용합니다.

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[:7]
[0, 10, 20, 30, 40, 50, 60]
>>> a[7:]
[70, 80, 90]
>>> a[:]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

a[:7]과 같이 시작 인덱스를 생략하면 리스트의 처음부터 끝 인덱스 직전까지 가져오고, a[7:]과 같이 끝 인덱스를 생략하면 시작 인덱스부터 리스트의 마지막까지 가져옵니다. 또는, a[:]와 같이 시작 인덱스와 끝 인덱스를 모두 생략하면 전체 리스트를 가져올 수도 있습니다.

그림 19-6 시작 인덱스와 끝 인덱스 생략하기
그림 22 6 시작 인덱스와 끝 인덱스 생략하기

이번에는 len을 응용하여 전체 리스트를 가져와보겠습니다.

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[0:len(a)]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[:len(a)]
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

a의 요소는 10개입니다. 따라서 len(a)는 10이고, a[0:10]과 같습니다. 여기서 끝 인덱스는 가져오려는 인덱스보다 1을 더 크게 지정한다고 했으므로 len(a)에서 1을 빼지 않아야 합니다. 즉, 길이가 10인 리스트는 [0:10]이어야 전체 문자열을 가져옵니다.

그림 19-7 len으로 전체 리스트 가져오기
그림 22 7 len으로 전체 리스트 가져오기