Unit 23. 리스트와 튜플 응용하기

지금까지 리스트의 기본적인 사용 방법을 알아보았습니다. 파이썬의 리스트는 생각보다 기능이 많은데 값을 추가/삭제하거나, 정보를 조회하는 함수도 제공합니다. 특히 for 반복문과 결합하면 연속적이고 반복되는 값을 손쉽게 처리할 수 있습니다.

23.1 리스트 조작하기

먼저 리스트를 조작하는 메서드(method)를 알아보겠습니다(메서드는 객체에 속한 함수를 뜻합니다. 자세한 내용은 '36.1 메서드 작성하기'에서 설명하겠습니다). 파이썬에서 제공하는 리스트 메서드는 여러 가지가 있지만 여기서는 자주 쓰는 메서드를 설명하겠습니다.

append(값)은 이름 그대로 리스트의 맨 뒤에 값을 추가합니다. 다음은 리스트 [10, 20]에 30을 추가하여 리스트는 [10, 20, 30]이 됩니다.

>>> a = [10, 20]
>>> a.append(30)
>>> a
[10, 20, 30]

물론 빈 리스트에 값을 추가할 수도 있습니다.

>>> a = []
>>> a.append(10)
>>> a
[10]

append(리스트)처럼 리스트를 넣으면 리스트 안에 리스트가 들어갑니다. 다음은 리스트 안에 [50, 60]이 들어가서 중첩 리스트가 됩니다.

>>> a = [10, 20]
>>> a.append([50, 60])
>>> a
[10, 20, [50, 60]]

extend(리스트)는 리스트의 맨 뒤에 다른 리스트를 연결합니다. 다음은 리스트 [10]에 다른 리스트 [20, 30]을 연결하여 [10, 20, 30]이 됩니다.

>>> a = [10]
>>> a.extend([20, 30])
>>> a
[10, 20, 30]

insert(인덱스, 값)은 리스트의 특정 인덱스에 값을 추가합니다. 다음은 리스트 [10, 20, 30]의 인덱스 2에 500을 추가하여 [10, 20, 500, 30]이 됩니다.

  • insert(0, 값): 리스트의 맨 처음에 값을 추가합니다.
  • insert(len(리스트), 값): insert에 마지막 인덱스보다 큰 값을 지정하면 리스트의 맨 뒤에 값을 추가합니다. 여기서 len(리스트)는 마지막 인덱스보다 1이 더 크므로 리스트 맨 뒤에 값을 추가할 때는 주로 len(리스트)를 활용합니다.
>>> a = [10, 20, 30]
>>> a.insert(2, 500)
>>> a
[10, 20, 500, 30]

remove(값)은 리스트에서 특정 값을 찾아서 삭제합니다. 이때 같은 값이 여러 개일 경우 처음 찾은 값을 삭제합니다. 다음은 리스트 [10, 20, 30]에서 20을 삭제하여 [10, 30]이 됩니다.

>>> a = [10, 20, 30]
>>> a.remove(20)
>>> a
[10, 30]

pop()은 리스트의 마지막 값을 삭제한 뒤 삭제한 값을 반환합니다. pop(인덱스)처럼 pop에 인덱스를 지정하면 해당 인덱스의 값을 삭제한 뒤 삭제한 값을 반환합니다. 다음은 리스트 [10, 20, 30]에서 pop으로 마지막 값을 삭제한 뒤 30을 반환합니다. 따라서 리스트는 [10, 20]이 됩니다.

>>> a = [10, 20, 30]
>>> a.pop()
30
>>> a
[10, 20]

이번에는 리스트의 값 정보 구하기, 정렬, 뒤집기 메서드를 사용해보겠습니다.

index(값)은 리스트에서 특정 값의 인덱스를 구합니다. 이때 같은 값이 여러 개일 경우 처음 찾은 인덱스를 구합니다(가장 작은 인덱스). 다음은 20이 두 번째에 있으므로 인덱스 1이 나옵니다.

>>> a = [10, 20, 30, 10, 25, 40]
>>> a.index(20)
1

count(값)은 리스트에서 특정 값의 개수를 구합니다. 다음은 리스트 [10, 20, 30, 10, 25, 40]에서 10의 개수를 구합니다. 여기서는 10이 두 개 들어있으므로 2가 나옵니다.

>>> a = [10, 20, 30, 10, 25, 40]
>>> a.count(10)
2

reverse()는 리스트에서 값의 순서를 반대로 뒤집습니다. 다음은 리스트 [10, 20, 30, 10, 25, 40]의 순서를 반대로 뒤집어서 [40, 25, 10, 30, 20, 10]이 됩니다.

>>> a = [10, 20, 30, 10, 25, 40]
>>> a.reverse()
>>> a
[40, 25, 10, 30, 20, 10]

sort()는 리스트의 값을 작은 순서대로 정렬(오름차순)합니다. 다음은 리스트 [10, 20, 30, 10, 25, 40]의 값을 작은 순서대로 정렬하여 [10, 10, 20, 25, 30, 40]이 됩니다.

  • sort(reverse=True): 리스트의 값을 큰 순서대로 정렬(내림차순)합니다.
>>> a = [10, 20, 30, 10, 25, 40]
>>> a.sort()
>>> a
[10, 10, 20, 25, 30, 40]

clear()는 리스트의 모든 값을 삭제합니다. 다음은 리스트 [10, 20, 30]의 값을 모두 삭제하여 빈리스트 []가 됩니다.

>>> a = [10, 20, 30]
>>> a.clear()
>>> a
[]

리스트는 메서드를 사용하지 않고, 인덱스로 범위를 지정하여 조작할 수도 있습니다. 다음은 리스트의 맨 뒤에 값이 한 개 들어있는 리스트를 추가합니다.

>>> a = [1, 2, 3]
>>> a[len(a):] = [10]
>>> a
[1, 2, 3, 10]

a[len(a):]는 시작 인덱스를 len(a)로 지정해서 리스트의 마지막 인덱스보다 1이 더 큰 상태입니다. 즉, 그림과 같이 리스트의 맨 뒤부터 시작하겠다는 뜻입니다(이때는 리스트의 범위를 벗어난 인덱스를 사용할 수 있습니다).

그림 23-1 a[len(a):]의 뜻
그림 23 1 a[len(a):]의 뜻

a[len(a):] = [10]과 같이 값이 한 개 들어있는 리스트를 할당하면 리스트 a의 맨 뒤에 값이 한 개 추가되며 a.append(10)과 같습니다.

마찬가지로 a[len(a):] = [10, 20]과 같이 리스트를 할당하면 리스트 a의 맨 뒤에 다른 리스트를 연결하며 a.extend([10, 20])과 같습니다.

>>> a = [1, 2, 3]
>>> a[len(a):] = [10, 20]
>>> a
[1, 2, 3, 10, 20]

리스트의 값을 삭제할 때는 del a[1]와 같이 del을 사용하여 특정 인덱스의 값을 삭제할 수 있습니다. 이때는 a.pop(1)과 같습니다.

>>> a = [10, 20, 30, 40, 50]
>>> del a[1]
>>> a
[10, 30, 40, 50]

그리고 del a[1:4]처럼 시작 인덱스와 끝 인덱스를 지정하면 시작 인덱스부터 끝 인덱스 직전까지 삭제합니다. 여기서는 시작 인덱스가 1, 끝 인덱스가 4이므로 인덱스 1부터 3까지의 값을 삭제합니다(값 20, 30, 40 삭제).

>>> a = [10, 20, 30, 40, 50]
>>> del a[1:4]
>>> a
[10, 50]

만약 del a[:]와 같이 시작, 끝 인덱스를 생략하면 리스트의 모든 값이 삭제됩니다. 이때는 a.clear()와 같습니다.

>>> a = [10, 20, 30, 40, 50]
>>> del a[:]
>>> a
[]