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

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

20.1 리스트 조작하기

먼저 리스트를 조작하는 메서드(method)입니다. 파이썬에서 제공하는 리스트 메서드는 여러 가지가 있지만 여기서는 자주 쓰는 메서드를 설명하겠습니다.

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이 더 큰 상태입니다. 즉, 그림과 같이 리스트의 맨 뒤부터 시작하겠다는 뜻입니다(이때는 리스트의 범위를 벗어난 인덱스를 사용할 수 있습니다).

그림 20-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
[]