[Python 입문 강좌 - 8] 파이썬 리스트(List) 정리 및 사용법

 

더보기

 

리스트에 대해 자세히 알아보고 리스트를 사용하는 방법에 대해 보도록 하겠습니다. 리스트는 자료형의 하나로 여러 개의 값을 담을 수 있는 순차적인 자료 구조입니다. 자료형(Data Type)이 무엇인지는 [Python 입문 강좌 -5]에서 알아봤습니다. 자료형에 대해 궁금하시면 링크를 통해 확인해주세요.


1.리스트(List) 소개

1.1 리스트의 정의와 구조

 

리스트(List)는 파이썬의 기본적인 자료형 중 하나로, 여러 개의 값을 담을 수 있는 순차적인 자료 구조입니다. 리스트에는 숫자, 문자열, 불리언 값, 또는 다른 리스트 등을 담을 수 있습니다.

리스트의 구조는 다음과 같습니다.

  • 여러 개의 요소(element)를 가지고 있습니다.
  • 각 요소는 순서가 있으며, 인덱스(Index)를 가집니다.
  • 리스트의 첫 번째 요소의 인덱스는 0, 두 번째 요소의 인덱스는 1, 세 번째 요소의 인덱스는 2, ... 이러한 순서로 부여됩니다.

 

파이썬 리스트 예시 이미지
fruits 리스트에 apple, banana, cherry 요소가 있다. 그리고 각 요소는 인덱스를 가지고 있다.

 


1.2 리스트의 장단점

 

장점:

  • 다양한 자료형을 포함할 수 있습니다.
  • 순차적인 자료 구조이므로, 쉽게 요소를 추가, 삭제, 수정할 수 있습니다.
  • 인덱스를 이용하여 요소에 접근할 수 있어, 빠른 접근이 가능합니다.
  • 내장 함수를 이용하여 리스트의 정렬, 검색, 길이 계산 등을 쉽게 수행할 수 있습니다.

단점:

  • 메모리 사용량이 많아질 수 있습니다.
  • 요소에 접근할 때, 모든 요소를 검색하여 인덱스를 찾아야 하므로, 탐색 속도가 느릴 수 있습니다.
  • 삭제, 추가, 수정 작업에서 리스트의 길이가 길어지면, 비효율적일 수 있습니다.

 


2.리스트 생성

2.1 리스트 생성 방법

 

리스트는 대괄호([ ])를 이용하여 생성할 수 있습니다. 각 요소는 쉼표(,)로 구분합니다. 예를 들어, 정수의 리스트는 다음과 같이 생성할 수 있습니다.

>>> numbers = [1, 2, 3, 4, 5]



리스트에는 다양한 자료형을 포함할 수 있습니다. 예를 들어, 문자열, 정수, 실수, 불리언 값 등을 포함한 리스트를 생성할 수 있습니다.

>>> mixed_list = [1, "hello", 3.14, True]

 


2.2 빈 리스트 생성

 

빈 리스트는 특정한 요소를 포함하지 않는 빈 자료구조입니다. 이후에 요소를 추가할 수 있습니다. 빈 리스트는 다음과 같이 생성할 수 있습니다.

>>> empty_list = []


또는 list()를 이용해서 생성할 수 있습니다.

>>> empty_list = list()

 


2.3 리스트 안에 다른 리스트 생성

 

리스트 안에 다른 리스트를 포함할 수 있습니다. 이를 중첩 리스트(nested list)라고 합니다. 아래와 같이 중첩 리스트를 생성할 수 있습니다.

>>> nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

 

중첩 리스트는 다음과 같은 구조를 가집니다. 첫 번째 인덱스는 [1, 2, 3] 리스트를 포함하고, 두 번째 인덱스는 [4, 5, 6] 리스트를 포함하고, 세 번째 인덱스는 [7, 8, 9] 리스트를 포함합니다.

 

리스트 안에 다른 리스트 생성 이미지

 

[
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]


3. 리스트 인덱싱

 

인덱싱은 특정 위치에 있는 요소를 추출하는 것을 의미합니다. 파이썬에서는 리스트의 각 요소에 인덱스(Index)를 할당하고, 이 인덱스를 사용하여 특정 위치에 있는 요소를 추출할 수 있습니다. 파이썬에서는 인덱스가 0부터 시작하므로, 리스트의 첫 번째 문자의 인덱스는 0이 됩니다.

 

3.1 리스트의 요소에 접근하기

 

리스트의 요소에 접근하려면, 리스트 이름과 요소의 인덱스를 사용하여 접근할 수 있습니다. 인덱스는 0부터 시작합니다.

 

리스트의 요소에 접근하기 이미지

 

>>> my_list = [1, 2, 3, 4, 5]
>>> print(my_list[0])
1
>>> print(my_list[2])
3

 

리스트의 요소에 접근하기 이미지

 

>>> nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> print(nested_list[0][0])
1
>>> print(nested_list[2][1])
8

 


3.2 음수 인덱스

 

요소에 접근하기 위해 음수 인덱스를 사용할 수도 있습니다. 음수 인덱스는 리스트의 마지막 요소부터 접근할 수 있습니다.

 

음수 인덱스 이미지

 

>>> my_list = [1, 2, 3, 4, 5]
>>> print(my_list[-1])
5
>>> print(my_list[-3])
3

 


3.3 슬라이싱

 

리스트에서 여러 개의 요소를 한꺼번에 추출하려면, 슬라이싱(slicing)을 사용할 수 있습니다. 슬라이싱은 문자열에서 일부분을 추출하는 것을 의미합니다. 여기서, start는 추출하고자 하는 요소의 시작 위치를, end는 끝 위치를 지정합니다. start와 end 사이의 요소들이 추출됩니다. step은 생략이 가능하며, 생략되면 기본 값 1로 적용됩니다.

 

list[start:end:step]

 

 

아래 예제에서, my_list[1:3]은 리스트 my_list의 1번째 요소부터 3번째 요소 전까지의 요소를 추출합니다. 즉, [2, 3]이 추출됩니다. 슬라이싱을 할 때, 첫 번째 인덱스는 포함되고, 두 번째 인덱스는 포함되지 않습니다. 즉, my_list[1:3]은 my_list[1]에서 my_list[2]까지의 요소를 포함합니다.

슬라이싱 이미지

 

>>> my_list = [1, 2, 3, 4, 5]
>>> print(my_list[1:3])
[2, 3]



만약, 첫 번째 인덱스를 생략하면, 0부터 시작합니다. 만약, 두 번째 인덱스를 생략하면, 리스트의 마지막 요소까지 추출합니다. 첫 번째 슬라이싱인 my_list[:3]에서 :3은 0부터 2까지의 요소를 추출하는 것을 의미합니다. 따라서, [1, 2, 3]이 출력됩니다. 두 번째 슬라이싱인 my_list[2:]에서 2:은 2부터 마지막 요소까지의 요소를 추출하는 것을 의미합니다. 따라서, [3, 4, 5]이 출력됩니다.

 

>>> print(my_list[:3])
[1, 2, 3]
>>> print(my_list[2:])
[3, 4, 5]

 

슬라이싱 이미지

 

>>> print(my_list[0:4:2])
[1, 3]

 


4. 리스트 연산

4.1 리스트의 더하기

 

리스트의 더하기는 두 개의 리스트를 연결하여 새로운 리스트를 생성하는 것을 의미합니다. 아래의 예제에서 list1과 list2를 더하여 list3가 생성되었습니다. list3의 값은 list1과 list2를 연결한 결과인 [1, 2, 3, 4, 5, 6] 입니다.

 

리스트의 더하기

 

>>> list1 = [1, 2, 3]
>>> list2 = [4, 5, 6]
>>> list3 = list1 + list2
>>> print(list3)
[1, 2, 3, 4, 5, 6]

 

 


4.2 리스트의 곱하기

 

리스트의 곱하기는 기존의 리스트를 반복하여 새로운 리스트를 생성하는 것을 의미합니다. 다음의 예제를 통해 더 자세히 알아보겠습니다. 예제에서 list1이 3번 반복되어 list2가 생성되었습니다. list2의 값은 list1이 3번 반복된 결과인 [1, 2, 3, 1, 2, 3, 1, 2, 3] 입니다.

 

리스트의 곱하기

 

>>> list1 = [1, 2, 3]
>>> list2 = list1 * 3
>>> print(list2)
[1, 2, 3, 1, 2, 3, 1, 2, 3]

 


4.3 리스트 수정과 삭제

 

리스트의 특정 위치에 있는 요소를 수정하려면 그 위치에 새로운 값을 할당하면 됩니다.

 

리스트 수정과 삭제

 

>>> a = [1, 2, 3, 4, 5]
>>> a[2] = 7
>>> print(a)
[1, 2, 7, 4, 5]

 

리스트의 일부 요소리르 삭제하려면 del 키워드를 사용하여 삭제할 수 있습니다.

리스트 수정과 삭제 이미지

 

>>> a = [1, 2, 3, 4, 5]
>>> del a[2]
>>> print(a)
[1, 2, 4, 5]

 



5. 리스트 관련 함수

5.1 len() 함수

 

리스트 연산에서 리스트의 길이는 리스트에 포함된 요소의 개수를 나타냅니다. 리스트의 길이는 파이썬 내장 함수 len()을 이용하여 구할 수 있습니다. 예를 들어, 리스트 my_list가 [1, 2, 3, 4, 5]와 같을 때, len(my_list)를 실행하면 요소의 개수 5가 반환됩니다.

 

>>> my_list = [1, 2, 3, 4, 5]
>>> print(len(my_list))
5

 


5.2 max() 함수

 

max() 함수는 리스트에서 가장 큰 값을 찾아주는 함수입니다. 만약 리스트의 요소가 각각 다른 타입의 자료형일 경우에는 오류가 발생할 수 있습니다. 문자열을 사용하는 경우는 알파벳 순서, 한글 순서에 따라서 최대값을 결정합니다. 예를 들어, 다음과 같은 리스트가 있다고 가정해봅시다. 이 때, max() 함수를 사용하면 다음과 같이 가장 큰 값인 5를 얻을 수 있습니다.

 

numbers = [1, 2, 3, 4, 5]
>>> max(numbers)
5

 


5.3 min() 함수

 

min() 함수는 리스트에서 가장 작은 값을 찾아 반환하는 함수입니다. 예를 들어, 다음과 같은 리스트가 있다고 가정해봅시다. 이 때, min(numbers) 를 호출하면 가장 작은 값인 1이 반환됩니다. max()함수와 마찬가지로 리스트의 요소가 각각 다른 타입의 자료형일 경우에는 오류가 발생할 수 있습니다.

 

numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3]
>>> min(numbers)
1

 


5.4 sum() 함수

 

sum() 함수는 리스트에 있는 값을 모두 더한 결과를 반환하는 함수입니다. 예를 들어, 다음과 같이 리스트 a가 있을 때, sum(a) 함수는 a에 있는 값들의 합을 반환합니다. sum() 함수는 리스트에 있는 모든 값을 더하기 때문에, 리스트에 있는 값이 정수이거나 실수이거나, 양수이거나 음수이거나 관계없이 모두 더할 수 있습니다.

 

>>> a = [1, 2, 3, 4, 5]
>>> print(sum(a))
15

 


5.5 sorted() 함수

 

sorted() 함수는 리스트에 저장된 값을 정렬하는 함수입니다. 리스트의 값을 오름차순 또는 내림차순으로 정렬할 수 있습니다. 정렬 결과는 새로운 리스트 객체를 반환합니다. 원본 리스트에는 영향을 미치지 않습니다. sorted() 함수는 정렬 순서를 내림차순으로 바꾸기 위해서는 reverse 인자를 True로 설정하면 됩니다. reverse 인자를 생략하면 기본 값 Fasle로 설정됩니다.

 

리스트 sorted함수 이미지

 

>>>my_list = [3, 4, 1, 5, 2]
>>>sorted_list = sorted(my_list)
>>>print(sorted_list) 
[1, 2, 3, 4, 5]

>>>my_list = [3, 4, 1, 5, 2]
>>>sorted_list = sorted(my_list, reverse=True)
>>>print(sorted_list)
[5, 4, 3, 2, 1]

 


6.리스트 관련 메서드

6.1 append() 메서드

 

append() 메서드는 리스트의 맨 끝에 새로운 요소를 추가하는 기능을 합니다. 아래 코드에서, my_list에 [1, 2, 3]이 저장되어 있고 append() 메서드를 사용하여 4라는 요소를 추가합니다. 이 결과, my_list는 [1, 2, 3, 4]가 됩니다.

 

>>> my_list = [1, 2, 3]
>>> my_list.append(4)
>>> print(my_list)
[1, 2, 3, 4]




6.2 insert() 메서드

 

insert() 메서드는 리스트에 새로운 요소를 삽입하는 기능을 가지고 있습니다. 이 함수는 두 개의 인자를 가집니다. 첫 번째 인자는 삽입할 위치를 나타내는 인덱스값이고, 두 번째 인자는 삽입할 요소의 값입니다. 예에서는 리스트 my_list의 2번째 위치에 'a' 값을 삽입하였습니다.

 

>>> my_list = [1, 2, 3, 4]
>>> my_list.insert(2, 'a')
>>> print(my_list)
[1, 2, 'a', 3, 4]

 


6.3 remove() 메서드

 

remove() 함수는 리스트에서 원하는 값을 삭제할 때 사용할 수 있는 함수입니다. remove() 함수는 리스트에서 특정 값이 처음 나오는 위치의 값을 삭제합니다. 예를 들어, 다음과 같은 리스트가 있다면 remove() 함수를 사용하여 2를 삭제하면 결과는 [1, 3, 2, 4, 5]입니다. 리스트에 2라는 값이 2개여서 가장 첫 번째 위치에 있는 2만 삭제됩니다.

 

>>> my_list = [1, 2, 3, 2, 4, 5]
>>> my_list.remove(2)
>>> print(my_list)
[1, 3, 2, 4, 5]

 


6.4 pop() 메서드

 

pop() 메서드는 파이썬 리스트에서 특정 인덱스에 해당하는 원소를 제거하고, 그 원소의 값을 반환하는 기능을 가집니다. 인덱스를 지정하지 않으면 기본적으로 맨 마지막 원소를 제거합니다.

 

예를 들어, 다음과 같은 리스트가 있다고 가정합니다. 만약 pop()메서드를 호출하지 않고 인덱스를 지정하지 않으면, 맨마지막 원소를 제거하고 그 값을 반환합니다. 인덱스를 지정하면, 해당 인덱스에 해당 원소를 제거하고 그 값을 반환합니다.

 

>>> numbers = [1, 2, 3, 4, 5]

>>> numbers.pop()
5

>>> print(numbers)
[1, 2, 3, 4]

>>> numbers.pop(1)
2

>>> print(numbers)
[1, 3, 4]

 


6.5 count() 메서드

 

count() 메서드는 파이썬 리스트 안에서 첫 번째 부터 마지막 까지 특정 요소의 개수를 세어서 반환합니다. 사용법은 다음과 같습니다. 아래 코드를 실행하면 결과는 3이 될 것입니다. 리스트에 1이 총 3개 있기 때문입니다.

 

>>> list_example = [1, 2, 3, 4, 5, 1, 1]
>>> count = list_example.count(1)
>>> print(count)
3

 


6.6 reverse() 메서드

 

reverse() 메서드는 파이썬 리스트의 순서를 거꾸로 뒤집습니다. 이 메서드는 원본 리스트를 직접 변경하므로, 리스트에서 복사본을 만들지 않아도 됩니다. 위에서 본 sorted()는 원본을 변경하지 않고 새로운 리스트를 만들었습니다. 그러나 reverse()는 원본을 변경합니다.

 

>>> numbers = [1, 2, 3, 4, 5]
>>> print("Original list:", numbers)
Original list: [1, 2, 3, 4, 5]

>>> numbers.reverse()
>>> print("Reversed list:", numbers)
Reversed list: [5, 4, 3, 2, 1]

 


6.7 extend() 메서드

 

extend() 메서드는 파이썬 리스트에 다른 리스트를 추가하는 데 사용할 수 있습니다. 아래 코드에서 list1에 list2를 추가하기 위해 extend()메서드를 사용했습니다. list1에 list2의 모든 요소가 추가되어 [1,2,3,4,5,6,7,8]이 출력됩니다.

 

>>> list1 = [1, 2, 3, 4]
>>> list2 = [5, 6, 7, 8]
>>> list1.extend(list2)
>>> print(list1)  
[1, 2, 3, 4, 5, 6, 7, 8]

 


6.8 index() 메서드

 

index 메서드는 리스트에서 특정 요소의 인덱스를 반환합니다. 만약 특정 요소가 리스트에 여러 번 나온다면, 가장 앞에 나오는 요소의 인덱스를 반환합니다. 리스트에 찾고자 하는 요소가 없으면 ValueError 예외가 발생합니다. 이때 예외를 처리할 수 있는 try-except 구문을 사용할 수 있습니다. (예외 처리는 추후 강의에서 자세히 설명할 예정입니다.) 

 

첫 번째 예에서는 banana의 인덱스를 찾기 위해 index() 메서드를 사용했습니다. fruits 리스트에 banana는 첫 번째 인덱스에 있습니다. 그러므로 출력은 1이 됩니다.  두 번째 예에서는 frape를 찾습니다. 그러나 fruits 리스트에 grape가 없어 ValueError가 나며 try-except구문에 의해 -1이 출력됩니다.

 

>>> fruits = ['apple', 'banana', 'cherry', 'banana']
>>> index = fruits.index('banana')
>>> print(index)  
1


>>> fruits = ['apple', 'banana', 'cherry']
>>> try:
>>>     index = fruits.index('grape')
>>> except ValueError:
>>>     index = -1
>>> print(index)  
-1