리스트 자료형
파이썬의 리스트 자료형은 C나 자바와 같은 언어의 배열 기능을 포함하고 있으며, 내부적으로 연결 리스트 자료구조를 채택하고 있어서 append(), remove() 등의 메서드를 지원한다. 파이썬의 리스트는 C++ 의 STL vector와 유사하다.
리스트 만들기
리스트는 대괄호([]) 안에 원소를 넣어 초기화하며, 쉼표로 원소를 구분한다. 리스트의 원소에 접근할 때는 인덱스를 이용하며 0부터 N시작한다. 비어있는 리스트를 선언할 때는 list() 또는 비어있는 대괄호([])를 사용할 수 있다.
a = [1,2,3,4,5]
print(a)
print(a[3]) # 4번째 원소에 접근
a = list() # 비어있는 리스트 생성 방법 1
print(a)
a = [] # 비어있는 리스트 생성 방법 2
print(a)
※ 크기가 N이고 모든 값이 0인 1차원 리스트 초기화 하기
n = 10
a = [0] * n
print(a)
리스트의 인덱싱과 슬라이싱
파이썬은 인덱스 값으로 음수를 사용할 수 있는데 음수를 넣으면 원소를 거꾸로 탐색할 수 있다.
예를 들어 인덱스에 -1을 넣으면 가장 마지막 원소가 출력된다.
a = [1,2,3,4,5,6,7,8,9]
# 뒤에서 첫 번째 원소 출력
print(a[-1])
# 뒤에서 세 번째 원소 출력
print(a[-3])
또한 리스트에서 연속적인 위치를 갖는 원소들을 가져와야 할 때는 슬라이싱을 이용할 수 있다.
대괄호 안에 콜론(:)을 넣어서 시작 인덱스와 (끝 인덱스 - 1)을 설정해주면 된다. 예를 들어 두 번째 원소부터 다섯 번째 원소까지의 모든 데이터를 갖는 리스트를 가져오고 싶다면 a[1 : 5]이라고 쓴다.
a = [1,2,3,4,5,6,7,8,9]
# 두 번째 원소부터 다섯 번째 원소까지 출력
print(a[1 : 5])
리스트 컴프리헨션
리스트 컴프리헨션은 리스트를 초기화하는 방법 중 하나이다. 리스트 컴프리헨션을 이용하면 대괄호([]) 안에 조건문과 반복문을 넣는 방식으로 리스트를 초기화할 수 있다.
예를 들어 0부터 19까지의 수 중에서 홀수만 포함하는 리스트를 만들고자 할 때는 다음과 같은 리스트를 초기화할 수 있다. 이 경우 한 줄의 소스코드로 리스트를 초기화할 수 있어 매우 간편하다.
# 0부터 19까지 값 중 홀수만 포함하는 리스트
array = [i for i in range(20) if i % 2 == 1]
print(array)
참고로 위 소스코드를 일반적인 소스코드로 작성하면 다음과 같다.
# 0부터 19까지 값 중 홀수만 포함하는 리스트
array = []
for i in range(20):
if i % 2 == 1:
array.append(i)
print(array)
다른 예시로 1부터 9까지 제곱 값을 포함하는 리스트를 만드는 방법이다.
# 1부터 9까지의 수의 제곱 값을 포함하는 리스트
array = [i * i for i in range(1,10)]
print(array)
※ 크기가 N x M 이고 모든 값이 0인 2차원 리스트 초기화 하기
# N x M 크기의 2차원 리스트 초기화
n = 3
m = 4
array = [[0] * m for i in range(n)]
print(array)
참고로 특정 크기의 2차원 리스트를 초기화할 때는 반드시 리스트 컴프리헨션을 이용해야 한다. 만약 다음과 같이 N x M 크기의 2차원 리스트를 초기화한다면, 의도치 않은 결과가 나올 수 있다.
# N * M 크기의 2차원 리스트 초기화(잘못된 방법)
n = 3
m = 4
array = [[0] * m] * n
array[1][1] = 5
print(array)
이는 내부적으로 포함된 3개의 리스트가 모두 동일한 객체로 인식되기 때문에 발생된 결과이다. 따라서 특정한 크기를 가지는 2차원 리스트를 초기화할 때는 리스트 컴프리헨션을 이용하는 것이 좋다.
리스트 관련 메소드
메서드명 | 사용법 | 설명 | 시간복잡도 |
append() | 변수명.append(특정 값) | 리스트에 원소를 하나 삽입한다. | O(1) |
sort() | 변수명.sort() | 오름차순으로 정렬한다. | O(NlogN) |
변수명.sort(reverse = True) | 내림차순으로 정렬한다. | O(NlogN) | |
reverse() | 변수명.reverse() | 리스트의 원소의 순서를 모두 뒤집어 놓는다. | O(N) |
insert() | 변수명.insert(삽입할 인덱스, 삽입할 값) | 특정한 인덱스 위치에 원소를 삽입한다. | O(N) |
count() | 변수명.count(특정 값) | 리스트에서 특정한 값을 가지는 데이터의 개수를 센다. | O(N) |
remove() | 변수명.remove(특정 값) | 특정한 값을 가진 원소 중 하나만 제거한다. | O(N) |
append() 함수의 시간복잡도가 O(1) 임에 비해 insert() 함수의 경우는 중간에 원소를 삽입한 후 리스트의 원소 위치를 조정해줘야 하기 때문에 O(N)이 소요된다. remove()도 마찬가지로 중간에 있는 원소를 삭제한 후 리스트의 원소 위치를 조정해줘야 하기 때문에 O(N)이 소요된다.
※특정한 값의 원소를 모두 제거하는 방법
다른 언어에서는 remove_all()과 같은 함수를 사용하지만 파이썬의 경우 그러한 함수를 제공해주지 않는다.
따라서 다음과 같은 방법을 이용하면 좋다.
a = [1,2,3,4,5,5,5]
remove_set = {3,5}
# remove_set에 포함되지 않는 값만을 저장
result = [i for i in a if i not in remove_set]
print(result)
참고자료: 이것이 취업을 위한 코딩 테스트다 with 파이썬 - 나동빈 지음(한빛미디어)
'Python > 파이썬 문법' 카테고리의 다른 글
[파이썬 문법] 함수 (0) | 2021.12.29 |
---|---|
[파이썬 문법] 파이썬의 조건문 (0) | 2021.12.28 |
[파이썬 문법] 입출력 (0) | 2021.12.28 |
[파이썬 문법] 그 외 다양한 자료형(문자열, 튜플, 사전, 집합) (0) | 2021.12.26 |
[파이썬 문법] 수 자료형 (0) | 2021.12.24 |