무엇을 하는 것인가
학생 서른 명의 점수를 변수 서른 개에 담을 수는 없습니다. 리스트는 값 여러 개를 한 이름에 순서대로 담아 두는 그릇입니다.
대괄호로 만듭니다. 점수 = [90, 85, 77]. 꺼낼 때는 0부터 세는 번호를 대괄호에 넣습니다. 점수[0]이 첫 번째입니다. 1이 아니라 0부터라는 점이 처음엔 어색하지만 곧 익숙해집니다.
뒤에서부터 셀 때는 음수를 씁니다. 점수[-1]이 마지막, 점수[-2]가 뒤에서 둘째입니다. 길이를 몰라도 마지막을 집을 수 있어 자주 씁니다.
슬라이싱으로 여러 개를 한 번에 잘라냅니다. 점수[1:3]은 1번부터 3번 앞까지, 즉 1번과 2번입니다. range와 마찬가지로 끝은 포함되지 않습니다. 파이썬은 이 규칙이 일관됩니다.
리스트는 만든 뒤에 바꿀 수 있습니다. append()로 뒤에 붙이고, remove()로 지우고, 번호로 직접 갈아끼울 수도 있습니다.
예제 코드
아래 코드가 위 버튼으로 받는 파일과 같은 내용입니다. 통째로 복사해 실행해 보고, 값을 바꿔 가며 결과가 어떻게 달라지는지 보는 편이 읽기만 하는 것보다 훨씬 빨리 익습니다.
# 리스트 — 값 여러 개를 한 이름에 순서대로 담기
점수 = [90, 85, 77, 68, 94]
print("첫 번째:", 점수[0]) # 0 부터 셉니다
print("마지막:", 점수[-1]) # 음수는 뒤에서부터
print("개수:", len(점수))
# 슬라이싱 — 끝 번호는 빠집니다 (range 와 같은 규칙)
print(점수[1:3]) # [85, 77] 1번, 2번
print(점수[:2]) # [90, 85] 처음부터 2번 앞까지
print(점수[2:]) # [77, 68, 94] 2번부터 끝까지
# 만든 뒤에 바꿀 수 있습니다
점수.append(100) # 뒤에 붙이기
점수[0] = 95 # 갈아끼우기
점수.remove(68) # 값으로 지우기
print(점수)
# 합계 · 평균 · 최대 · 최소는 만들어 놓은 걸 씁니다
print("합계:", sum(점수))
print("평균:", sum(점수) / len(점수))
print("최고:", max(점수), "최저:", min(점수))
# 정렬 — sort() 는 원본을 바꾸고, sorted() 는 새 리스트를 돌려줍니다
print("정렬본:", sorted(점수, reverse=True))
print("원본 그대로:", 점수)
# 여기서 많이 당합니다. = 는 복사가 아니라 이름 하나를 더 붙이는 것입니다.
사본 = 점수
사본.append(0)
print("원본까지 바뀜:", 점수)
진짜사본 = 점수.copy() # 또는 점수[:]
진짜사본.append(999)
print("원본은 그대로:", 점수)
# for 와 같이 쓰면 제 몫을 합니다
for i, 값 in enumerate(점수, 1):
print(i, "번째 학생:", 값, "점")
기억할 것
- 번호는 0부터. 첫 번째가
[0], 마지막이[-1]. [1:3]은 1번과 2번. 끝 번호는 빠집니다.- 개수는
len(), 뒤에 붙이기는append(). 목록2 = 목록1은 복사가 아니라 같은 것을 가리키게 합니다. 복사하려면목록1[:]또는목록1.copy().
자주 묻는 것
IndexError: list index out of range 가 납니다
없는 번호를 집었다는 뜻입니다. 원소가 3개면 번호는 0,1,2 뿐이라 [3]은 오류입니다. len(목록)으로 개수를 확인하고, 마지막은 [-1]로 집으세요.
리스트를 복사했는데 원본까지 바뀝니다
b = a는 값을 복사하는 게 아니라 같은 리스트에 이름을 하나 더 붙이는 것입니다. 그래서 b를 고치면 a도 바뀝니다. 진짜 복사는 b = a.copy() 또는 b = a[:]입니다.
리스트와 튜플은 뭐가 다른가요
튜플은 소괄호로 만들고 만든 뒤 못 바꿉니다. 바뀌면 안 되는 값(좌표, 설정값)에 씁니다. 바꿔 가며 쓸 거면 리스트입니다.
정렬은 어떻게 하나요
목록.sort()는 원본을 정렬해 버리고, sorted(목록)은 원본을 두고 정렬된 새 리스트를 돌려줍니다. 원본을 지켜야 하면 sorted()를 쓰세요.