c언어의 array처럼, 파이썬에도 많은 값을 한번에 저장하는 선형구조 자료형인 list가 있다. 리스트는 다음과 같이 초기화한다.
공백 리스트를 생성하고 다음과 같이 append() 메서드를 이용해 요소를 추가하면 된다.
❗파이썬에서의 리스트
다른 언어에서의 배열과 리스트가 다른 점은, 리스트의 크기는 지정되어 있지 않고 가변적이라는 것이다.
또, 파이썬에서는 다양한 타입의 데이터를 하나의 리스트에 같이 저장하는 것이 가능하다.
서로 다른 자료형의 데이터들을 하나의 리스트에 저장할 수 있으며, 리스트 안에 다른 리스트를 포함시킬 수 있다.
리스트의 요소는 인덱스를 통해 접근한다. 인덱스는 0부터 시작한다. 파이썬에서는 음수 인덱스가 존재한다.
for i in range(len(list)):
print(list[i])
for element in list:
print(element)
다음과 같은 형식을 가진다.
리스트의 크기를 알 필요 없이, 리스트의 모든 요소에 대해 반복된다.
리스트는 list 클래스에 의해 정의된다. 따라서 list 클래스의 생성자를 이용해 리스트를 생성할 수 있다.
아래 표현과 동일하다.
리스트는 시퀀스 자료형에 포함되는데, 시퀀스 자료형에는 문자열, 바이트 시퀀스, 바이트 배열, 리스트, 튜플, range 객체가 있다. 시퀀스 자료형은 순서를 가지는 원소들의 집합이며, 인덱스를 이용해 참조할 수 있다.
❗시퀀스에서 사용 가능한 대표적인 연산자, 함수는 다음과 같다. 자주 사용되고 중요하므로 꼭 알아둘 것.
인덱싱이란 리스트에서 인덱스를 이용해 원소를 참조하는 것을 의미한다. 인덱스는 정수이며 0부터 시작한다.
파이썬에서는 음수 인덱스가 존재하는데, 리스트의 마지막 원소의 음수 인덱스는 -1이다.
슬라이싱은 리스트 안에서 범위를 지정해 원하는 원소들로 새 리스트를 생성하는 연산이다. 다음과 같이 작성한다.
list[start:end]
아래 예시에서 확인할 수 있듯이 인덱스 end - 1
까지의 원소를 반환한다.
슬라이싱 연산에서 시작과 마지막 인덱스를 생략할 수 있는데, 인덱스가 생략되면 시작 인덱스는 0, 마지막 인덱스는 리스트 길이 - 1
이 된다.
문자열과는 다르게 리스트는 변경 가능한 객체이므로 리스트 내용을 바꿀 수 있다.
인덱스를 통해 값에 접근해 변경하는 것도 가능하지만, 슬라이싱에 값을 대입할 수도 있다. 리스트의 크기를 변경해도 되며 공백 리스트로 슬라이싱한 부분의 원소를 대체해 리스트의 내용을 삭제하는 것 또한 가능하다.
letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
print(letters)
letters[2:5] = ['C', 'D', 'E']
print(letters)
letters [2:5] = []
print(letters)
['a', 'b', 'c', 'd', 'e', 'f', 'g']
['a', 'b', 'C', 'D', 'E', 'f', 'g']
['a', 'b', 'f', 'g']
인덱싱과 슬라이싱 외에 다양한 연산이 가능하다. 리스트 객체의 메서드(method)를 사용할 수 있다. 메서드는 객체가 가지고 있는 함수를 말한다.
len() 함수는 리스트의 길이를 반환한다.
append() 함수를 사용해 리스트의 끝에 새 원소를 추가할 수 있다. list.append(추가내용)
과 같이 작성한다.
insert() 함수는 리스트의 특정 위치에 새 원소를 추가할 수 있다. insert(index, 추가내용)
과 같이 작성한다. 나머지 원소들은 모두 하나씩 뒤로 밀린다.
in 연산자를 이용해 원소가 리스트에 존재하는지 아닌지 알 수 있다.
index() 메서드를 이용하면 특정 원소의 리스트 안에서의 위치를 알 수 있다.
이 때, 리스트에 없는 항목을 index() 함수로 찾으면 오류가 발생할 수 있으므로 다음과 같이 리스트에 항목이 있는지를 확인한 후 항목의 인덱스를 찾는 것이 좋다.
if "element" in list:
index = index.list("element")
pop() 메서드는 특정한 위치에 있는 항목을 삭제한다. 해당 인덱스에 있는 항목이 삭제되는 동시에 반환된다.
remove() 메서드는 항목을 받아서 제거한다. 항목의 인덱스가 아닌, 값을 받아서 해당 항목과 일치하는 원소를 삭제한다. 동일한 항목이 여러개 있는 경우, 앞에 있는 항목을 삭제.
count() 메서드를 이용해 특정 항목이 리스트에 몇 번 들어있는지 셀 수 있다. 리스트에 삽입된 횟수를 반환한다.
list = [1, 2, 3, 3, 3, 6]
print(list.count(1))
print(list.count(3))
1
3
리스트를 비교하기 위해 비교 연산자 ==
!=
>
<
를 사용할 수 있다.
==
를 이용해 2개의 리스트의 일치를 검사할 수 있다. 리스트의 길이, 원소의 자료형, 내용 등 완전히 일치해야 True를 반환한다.
!=
은 일치하지 않는 경우에 True를 반환하게 된다.
>
와 <
는 리스트의 모든 원소에 대해 True가 나와야만 전체 리스트에 대한 연산이 True로 반환된다.
(이 때, 비교하는 리스트의 길이가 다른 경우 짧은 리스트의 원소만큼만 비교하여 결과를 반환한다.)
max()
, min()
메서드를 이용해 리스트의 최대값, 최소값을 구할 수 있다.
리스트의 요소를 크기 순으로 정렬하는 방법은 다음과 같다.
리스트 객체의 sort() 메서드를 이용
sort()로 정렬하게 되면 원본 리스트가 변경되어 정렬된 리스트로 바뀐다.
내장함수 sorted()를 이용
sorted() 함수로 정렬하면 원본은 변경되지 않고 정렬된 새로운 리스트를 반환한다.
이 때, key 매개변수에 원소 정렬 전 호출되는 함수를 지정할 수 있다. 예를 들어 대소문자를 가리지 않고 비교하는 경우 다음과 같이 str.lower() 함수를 지정할 수 있다.
sorted(["Ant", "rabbit", "Turtle", "bee"], key = str.lower)
list.sort()와 sorted()는 모두 부울형의 reverse 매개변수를 가진다. 이 매개변수는 정렬 방향을 지정할 때 사용된다. 리스트를 역순으로 정렬하려는 경우 sorted([2, 1, 5, 7, 8, 2], reverse = True)
와 같이 전달하면 된다.
reverse() 메서드를 이용해 리스트의 원소를 반대로 나열할 수 있다.
list = [1, 2, 3]
list.reverse()
print(list)
[3, 2, 1]
문자열의 str.split() 메서드는 문자열을 분리하고 이를 리스트로 만들어 반환한다. 이 때 문자열을 분리하는 분리자를 지정할 수 있다. 분리자가 지정되지 않으면 스페이스를 이용해 문자열을 분리한다.
str = "Hi, This is example"
print(str.split())
print(str.split(','))
['Hi,', 'This', 'is', 'example']
['Hi', ' This is example']
extend() 메서드를 이용해 리스트를 확장할 수 있다.
list = [1, 2, 3]
plus = [4, 5, 6]
list.extend(plus)
print(list)
list.extend([7, 8, 9])
print(list)
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
파이썬에서 리스트 변수는 리스트 객체를 직접 저장하고 있지 않다. 리스트의 참조값이 변수에 저장된다.
만약 리스트를 복사하기 위해 다음과 같이 대입 연산자를 사용한 경우, 리스트는 복사되지 않는다.
단지 score와 values는 동일한 리스트 객체를 가리키게 된다.
이 경우 같은 리스트를 가리키고 있는 다른 이름일 뿐이므로 score의 내용을 변경하면 values의 내용도 바뀐다. 이러한 방식의 복사를 얕은 복사(shallow copy)라 한다.
리스트를 복사하여 새 리스트를 생성하려면, 깊은 복사(deep copy)를 해야한다. 깊은 복사를 하는 방법은 다음과 같다.
from copy import deepcopy
scores = [ 10, 20, 30, 40, 50 ]
values = deepcopy(scores)
또는