리스트
- 여러개의 데이터를 연속적으로 담아 처리하기 위해 사용하는 자료형
- C나 자바의 배열 기능 및 연결리스트와 유사한 기능을 지원한다.
- 배열 혹은 테이블이라고 부르기도 한다.
리스트의 초기화
- 대괄호[] 안에 원소를 넣어 초기화하고 쉼표(,)로 원소를 구분
- 비어있는 리스트를 선언할 때는 list() 또는 [] 를 이용한다.
- 리스트의 인덱스는 0부터 시작하고 리스트의 원소에 접근할 때는 인덱스의 값을 대괄호 안에 넣는다.
a = [1, 2, 3, 4, 5]
print(a[3]) # 4번째 인 4가 출력된다.
a[4] = 5 # 리스트인 변수 a의 4번째 원소를 5로 변경
print(a) # [1, 2, 3, 5, 5] 가 출력된다.
# 크기가 n이고 모든 값이 0인 리스트 초기화
n = 10
a = [0] * n
리스트의 인덱싱(Indexing)
- 인덱스 값을 입력하여 리스트의 특정한 원소에 접근하는 것
- 인덱스 값은 양의 정수와 음의 정수 사용
- 음의 정수 사용 시 거꾸로 탐색(-1 부터 차례대로 작아지는 방식으로 접근 가능)
a = [1, 2, 3, 4, 5]
print(a[4]) # 5번째 원소인 5 출력
print(a[-1]) # 뒤에서 첫번째 원소 5 출력
print(a[-3]) # 뒤에서 세번째 원소 3 출력
리스트의 슬라이싱(Slicing)
- 연속적인 위치를 갖는 원소들을 가져와야 할 때 사용
- 콜론(:)을 사용하여 시작 인덱스와 끝 인덱스를 설정할 수 있음
- 끝 인덱스는 실제 인덱스보다 1을 크게 설정해야함
# 인덱스번호 : a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8]
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[1 : 4])
# 두번째 원소 부터 네 번째 원소까지 [2, 3, 4] 출력
# a[1] ~ a[4-1=3]
# a[1] a[2] a[3] 출력됨
리스트의 컴프리헨션
- 리스트를 초기화하는 방법 중 하나로 대괄호 안에 조건문과 반복문을 적용하여 리스트를 초기화 한다.
# 기본 사용법
array = [i for i in range(10)] # 0~9 까지 10개의 수를 포함하는 리스트를 만든다.
# for문 뒤 if로 조건문 적용
array = [i for i in range(20) if i % 2 == 1] # 0부터 19까지의 수 중 홀수만 포함하는 리스트를 만든다.
# 기본 코드 4줄 리스트 컴프리헨션 1줄로 편리하게 리스트를 초기화 할 수 있다.
array = []
for i in range(20) :
if i % 2 == 1 :
array.append(i)
# i*i 로 for문 앞의 값 변경
array = [i*i for i in range(1, 10) # 1부터 9까지 수들의 제곱 값을 포함하는 리스트를 만든다.
array = list(i*i for i in range(1, 10)) #1부터 9까지 수들의 제곱 값을 포함하는 리스트를 만든다.
- 리스트 컴프리헨션은 2차원 리스트를 초기화할 때 효과적으로 사용할 수 있다.
- 4 x 3 크기의 2차원 리스트 초기화 예
n = 4
m = 3
array = [[0] * m for _ in range(n)]
- for문에서의 언더바(_) : 반복을 수행하되 반복을 위한 변수의 값을 무시하고자 할 때 사용
- 4 x 3 크기의 2차원 리스트 초기화 잘못된 예
array = [[0] * 3 ] * 4
# 초기화는 정상적으로 되나 내부적으로는 첫 행이 4번 복사되는 결과가 발생함
# 단순히 리스트를 4번 곱하게 되면 [[0] * 3]인 리스트의 참조 값을 4번 복사하는 것과 같음
# 0 0 0
# 0 0 0
# 0 0 0
# 0 0 0
array[1][1] = 5
print(array) # array[1][1] 뿐 아니라 [0][1] [2][1] [3][1] 까지 바뀜
# 0 5 0
# 0 5 0
# 0 5 0
# 0 5 0
코딩테스트에서 자주 쓰이는 리스트의 주요 메서드
함수명 | 사용법 | 설명 | 시간 복잡도 |
append() | a.append(값) | 리스트에 원소를 하나 삽입한다. | O(1) |
sort() |
a.sort() | 오름차순 정렬 | O(NlogN) |
a.sort(reverse = True) | 내림차순 정렬 | ||
reverse() | a.reverse() | 리스트 원소의 순서를 모두 뒤집는다. | O(N) |
insert() | a.insert(인덱스, 삽입할 값) | 특정한 인덱스 위치에 원소를 삽입 | O(N) |
count() | a.count(특정 값) | 리스트에서 특정한 값을 데이터의 개수를 셀 때 사용 | O(N) |
remove() | a.remove(특정 값) | 특정한 값은 갖는 원소를 제거. 값을 가진 원소가 여러개면 하나만 제거함. | O(N) |
index() | a.index(특정 값) | 특정 값을 가지고 있는 0에서 가장 가까운 위치의 index 반환 | O(N) |
a = [1, 1, 2, 3, 3, 4]
# 값이 3인 데이터 개수 세기
print(a.count(3)) # 3이 두개이므로 2 출력
# 값이 1인 데이터 하나만 삭제
a.remove(1)
print(a) # 1인 원소 하나만 삭제되어 [1, 2, 3, 3, 4] 출력됨
리스트에서 특정 값을 가지는 원소를 모두 제거하기
- remove 메서드는 특정 값을 가지는 원소 하나만 제거하기 때문에 모두 제거하려면 다음과 같은 방법을 사용한다.
a = [1, 2, 3, 4, 5, 5, 5]
remove_set = {3, 5}
result = [i for i in a if i not in remove_set]
print(result) # [1, 2, 4]
i in a # 리스트 a에서 i라는 변수가
for # 하나씩 돌면서
if i not in remove_set # i가 remove_set에 포함되어 있지 않다면
i # 조건에 만족하는 i만 리스트에 포함
- if list명 list가 존재?
- if not list명 list 비어있는지?
본 글은 나동빈 - 이코테 2021 강의 몰아보기를 토대로 작성한 정리입니다.
좋은 강의를 올려주신 나동빈님께 감사드립니다.
또한 코딩테스트 문제를 풀면서 필요한 부분들을 추가하고 있어 강의내용과 다를 수 있습니다!
'코딩테스트' 카테고리의 다른 글
이코테 5강 리뷰 (사전, 집합 자료형) (0) | 2022.05.13 |
---|---|
이코테 4강 리뷰 (문자열, 튜플 자료형) (0) | 2022.05.13 |
이코테 2강 리뷰 (수 자료형과 연산) (0) | 2022.05.10 |
이코테 1강 리뷰 (알고리즘 성능 평가) (0) | 2022.05.10 |