테마
Python 기본: 리스트·range·슬라이스
Python 출력 문제는 대부분 리스트를 어떻게 자르고 바꾸었는지를 따라가면 풀린다. 이 문서는 리스트(list)·튜플(tuple)·딕셔너리(dictionary)·집합(set) 네 가지 기본 자료형과 인덱스(index)·슬라이싱(slicing)·range, 리스트 메서드(method)를 다룬다. 딕셔너리·집합·문자열 메서드와 리스트 컴프리헨션(list comprehension)·나눗셈은 다음 문서에서 다룬다. 모든 설명과 출력은 Python 3 기준이다.
네 가지 모음 자료형
값을 여러 개 담는 자료형은 네 가지다. 어떤 괄호로 만들었는지가 곧 자료형이고, 그에 따라 순서가 있는지와 값을 바꿀 수 있는지가 정해진다. 그래서 문제를 읽을 때 괄호 모양부터 확인해야 어떤 메서드가 쓰일지 예상할 수 있다.
| 자료형 | 생성 | 순서 | 변경 | 중복 |
|---|---|---|---|---|
| 리스트 | [1, 2] | 있음 | 가능 | 허용 |
| 튜플 | (1, 2) | 있음 | 불가 | 허용 |
| 딕셔너리 | {"k": 1} | 넣은 순서 | 가능 | 키 중복 불가 |
| 집합 | {1, 2} | 없음 | 가능 | 불가 |
리스트는 가장 흔한 순서 있는 모음이다. 튜플은 한 번 만들면 바꿀 수 없어서, 바뀌면 안 되는 값을 묶을 때 쓴다. 딕셔너리는 키로 값을 찾는 모음이고, Python 3.7부터는 키를 넣은 순서가 보장된다. 집합은 중복을 자동으로 없애 주지만 순서가 없으므로, 집합을 그대로 반복해 출력하는 코드는 실행 환경에 따라 순서가 달라질 수 있다. 빈 {}는 집합이 아니라 빈 딕셔너리이고, 빈 집합은 set()으로 만든다.
인덱스와 슬라이싱
인덱스는 0부터 센다. 음수 인덱스는 뒤에서부터 세는 번호로, -1이 마지막 요소다. 슬라이싱은 a[시작:끝:간격]으로 일부를 잘라 새 리스트를 만드는 문법이다. 끝 번호의 요소는 포함하지 않는다는 점이 가장 많이 틀리는 곳이다. 시작을 비우면 처음부터, 끝을 비우면 마지막까지 자른다. 간격이 음수면 거꾸로 걸으므로 시작 번호가 끝 번호보다 뒤에 있어야 하고, a[1:4:-1]처럼 거꾸로 갈 수 없는 범위는 오류 없이 빈 리스트가 된다.
python
a = [10, 20, 30, 40, 50]
print(a[-1], a[1:4], a[::-1], a[::2])
# 50 [20, 30, 40] [50, 40, 30, 20, 10] [10, 30, 50]
print(a[:2], a[3:], a[4:1:-1], a[1:4:-1])
# [10, 20] [40, 50] [50, 40, 30] []
print(list(range(1, 10, 3)), list(range(5, 0, -2)))
# [1, 4, 7] [5, 3, 1]range(start, stop, step)도 같은 규칙이다. stop은 포함하지 않으므로 range(1, 10, 3)은 1, 4, 7에서 멈춘다. 인자가 하나면 0부터, 둘이면 간격 1이다. 문자열도 순서가 있는 모음이라 인덱스와 슬라이싱이 똑같이 된다.
리스트 메서드
메서드마다 리스트 자체를 바꾸는지, 새 값을 돌려주는지가 다르다. 이 구분을 놓치면 출력이 None이 되거나 원본이 그대로인 문제를 틀린다.
| 메서드 | 하는 일 |
|---|---|
append(x) | 끝에 x 하나 추가 (리스트도 통째 1개) |
extend(l) | l의 요소를 하나씩 끝에 추가 |
insert(i, x) | i 위치에 x 삽입 |
pop(i) | i 위치 값을 꺼내 돌려줌, 생략하면 끝 |
remove(x) | 처음 나온 값 x 하나 삭제 |
sort()·reverse() | 원본을 바꾸고 None 반환 |
sorted(l) | 정렬한 새 리스트 반환 |
count(x)·index(x) | x의 개수, 처음 위치 |
a.append([1, 2])는 요소 두 개가 아니라 리스트 하나를 붙이므로 길이가 1만 늘어난다. pop은 위치를, remove는 값을 받는다는 차이도 자주 묻는다.
시험 포인트
a[1:4]→ 1, 2, 3번 요소. 끝 번호는 빠진다.a[::-1]→ 뒤집기,a[::2]→ 한 칸씩 건너뛰기.a[4:1:-1]→ 4, 3, 2번,a[1:4:-1]→ 빈 리스트.range(5, 0, -2)→ 5, 3, 1. stop 0은 포함하지 않는다.appendvsextend: 통째로 1개 vs 풀어서 여러 개.pop(위치)vsremove(값).sort()는None을 돌려주고 원본을 바꾼다.sorted()는 새 리스트를 돌려준다.
