🌱
기초 (Basic)
리스트 · 슬라이싱 · 메서드 · 튜플 · 언패킹
6주차 — 리스트와 튜플
여러 값을 순서대로 담는 리스트와 변경 불가능한 튜플, 슬라이싱 [start:stop:step], 자주 쓰는 메서드(append/pop/sort), 그리고 튜플 언패킹을 익힙니다.
listtupleslicingenumerate
소요 시간
⏱ 2시간
난이도
📊 완전 초보
선수 조건
🎯 5주차
결과물
점수 통계·로또 생성기 같은 리스트 활용 프로그램
이 강의에서 배우는 것
- 1리스트 생성·인덱싱·슬라이싱을 자유롭게 한다
- 2자주 쓰는 리스트 메서드(append/pop/sort 등)를 활용한다
- 3튜플의 특징과 언패킹을 이해한다
- 4리스트 vs 튜플 의 차이와 용도를 안다
1. 리스트
여러 값을 순서대로 담는 자료구조. 대괄호 [...].
python
fruits = ["사과", "바나나", "포도"]
print(fruits[0]) # 사과
print(fruits[-1]) # 포도 (음수 = 뒤에서)
print(len(fruits)) # 32. 슬라이싱
[시작:끝:간격]. 끝은 포함하지 않습니다.
python
nums = [10, 20, 30, 40, 50]
print(nums[1:4]) # [20, 30, 40]
print(nums[:3]) # [10, 20, 30]
print(nums[2:]) # [30, 40, 50]
print(nums[::-1]) # [50, 40, 30, 20, 10] (역순)
print(nums[::2]) # [10, 30, 50]3. 자주 쓰는 메서드
| 메서드 | 동작 |
|---|---|
| append(x) | 끝에 추가 |
| insert(i, x) | i 위치에 삽입 |
| pop() / pop(i) | 마지막 / i번째 제거하고 반환 |
| remove(x) | x 값 제거 |
| sort() | 정렬 (제자리) |
| reverse() | 뒤집기 (제자리) |
| index(x) | x의 위치 |
| count(x) | x의 개수 |
python
nums = [3, 1, 4, 1, 5]
nums.append(9) # [3, 1, 4, 1, 5, 9]
nums.sort() # [1, 1, 3, 4, 5, 9]
nums.reverse() # [9, 5, 4, 3, 1, 1]
print(nums.count(1)) # 24. 순회와 enumerate
python
fruits = ["사과", "바나나", "포도"]
for fruit in fruits:
print(fruit)
for i, fruit in enumerate(fruits, start=1):
print(f"{i}번: {fruit}")5. 튜플
리스트와 비슷하지만 변경 불가능(immutable). 소괄호 (...).
python
point = (10, 20)
x, y = point # 언패킹
print(x, y) # 10 20
# 튜플은 수정 불가
# point[0] = 5 # TypeError6. 리스트 vs 튜플
| 리스트 | 튜플 | |
|---|---|---|
| 문법 | [...] | (...) |
| 변경 | 가능 | 불가 |
| 용도 | 자주 바뀌는 데이터 | 고정 데이터 (좌표, RGB) |
| 속도 | 느림 | 빠름 |
7. 자주 하는 실수
1) 인덱스 범위 초과
python
a = [1, 2, 3]
print(a[3]) # IndexError→ 마지막은 a[-1] 또는 a[len(a)-1].
2) sort() 의 반환값을 변수에 할당
python
sorted_list = nums.sort() # None! 제자리 정렬이라 반환값 없음→ nums.sort() 후 nums 자체가 정렬됨. 새 리스트 원하면 sorted(nums).
3) 리스트 복사 함정
python
a = [1, 2, 3]
b = a # 같은 리스트를 가리킴!
b.append(4)
print(a) # [1, 2, 3, 4] — a도 바뀜→ 복사하려면 b = a.copy() 또는 b = a[:].
4) 빈 튜플 만들기
() 는 빈 튜플. 하나짜리 튜플은 (5,) (콤마 필수). (5) 는 그냥 정수 5.
8. FAQ
Q1. 리스트에 다른 타입을 섞어도 되나요?
네. [1, "hi", True, [1,2]] 가능. 다만 같은 타입을 권장.
Q2. 슬라이스의 끝이 왜 미포함인가요?
range, 인덱스 등과 일관성을 위해. 길이 계산이 끝-시작 으로 자연스러움.
Q3. sort() 와 sorted() 의 차이는?
sort() 는 메서드, 원본 변경. sorted() 는 함수, 새 리스트 반환.
💻 예제 (examples)
실제로 실행해 결과를 확인할 수 있는 예제 코드입니다.
01_list_basic.py— 리스트 생성·인덱싱
CODE
fruits = ["사과", "바나나", "포도"]
print(fruits)
print(fruits[0]) # 사과
print(fruits[-1]) # 포도
print(len(fruits)) # 3
fruits.append("딸기")
print(fruits) # ['사과', '바나나', '포도', '딸기']
▶ 실행 결과
['사과', '바나나', '포도']
사과
포도
3
['사과', '바나나', '포도', '딸기']02_slicing.py— 슬라이싱 [start:stop:step]
CODE
nums = [10, 20, 30, 40, 50]
print(nums[1:4]) # [20, 30, 40]
print(nums[:3]) # [10, 20, 30]
print(nums[2:]) # [30, 40, 50]
print(nums[::-1]) # 역순
print(nums[::2]) # 2칸씩
▶ 실행 결과
[20, 30, 40]
[10, 20, 30]
[30, 40, 50]
[50, 40, 30, 20, 10]
[10, 30, 50]03_methods.py— append/insert/pop/sort/reverse
CODE
nums = [3, 1, 4, 1, 5]
nums.append(9)
print("append:", nums)
nums.insert(0, 100)
print("insert:", nums)
last = nums.pop()
print("pop:", last, nums)
nums.sort()
print("sort:", nums)
nums.reverse()
print("reverse:", nums)
print("count(1):", nums.count(1))
▶ 실행 결과
append: [3, 1, 4, 1, 5, 9]
insert: [100, 3, 1, 4, 1, 5, 9]
pop: 9 [100, 3, 1, 4, 1, 5]
sort: [1, 1, 3, 4, 5, 100]
reverse: [100, 5, 4, 3, 1, 1]
count(1): 204_tuple.py— 튜플과 언패킹
CODE
point = (10, 20)
x, y = point
print(x, y)
# 두 값 교환
a, b = 1, 2
a, b = b, a
print(a, b)
# 단일 요소 튜플은 콤마 필수
single = (5,)
print(type(single)) # <class 'tuple'>
print(type((5))) # <class 'int'>
▶ 실행 결과
10 20
2 1
<class 'tuple'>
<class 'int'>📝 과제 (exercises)
직접 풀어보고, 막힐 때 정답을 펼쳐 비교해보세요.
과제 1
학생 점수 통계
목표: 5명의 점수를 리스트에 저장하고 총점·평균·최고·최저를 출력한다.
요구사항
- 5명의 점수를 입력받아 리스트에 저장
- 총점, 평균, 최고점, 최저점 출력
입출력 예시
1번 학생 점수: 85
2번 학생 점수: 92
3번 학생 점수: 78
4번 학생 점수: 88
5번 학생 점수: 95
총점: 438
평균: 87.6
최고점: 95
최저점: 78▶정답 코드 펼치기 / 접기
SOLUTION
scores = []
for i in range(1, 6):
s = int(input(f"{i}번 학생 점수: "))
scores.append(s)
total = sum(scores)
avg = total / len(scores)
print()
print(f"총점: {total}")
print(f"평균: {avg:.1f}")
print(f"최고점: {max(scores)}")
print(f"최저점: {min(scores)}")
▶ 실행 결과
1번 학생 점수: 85
2번 학생 점수: 92
3번 학생 점수: 78
4번 학생 점수: 88
5번 학생 점수: 95
총점: 438
평균: 87.6
최고점: 95
최저점: 78과제 2
로또 번호 생성기
목표: 1~45 중 중복 없이 6개를 뽑아 정렬해 출력한다.
요구사항
- random.sample 사용
- 결과는 오름차순 정렬
- 도전: 5게임을 한 번에
입출력 예시
이번 주 로또 번호: [3, 14, 22, 28, 35, 41]▶정답 코드 펼치기 / 접기
SOLUTION
import random
# 1게임
numbers = sorted(random.sample(range(1, 46), 6))
print("이번 주 로또 번호:", numbers)
# 도전: 5게임
print("\n[5게임]")
for i in range(1, 6):
game = sorted(random.sample(range(1, 46), 6))
print(f"{i}게임: {game}")
▶ 실행 결과
이번 주 로또 번호: [3, 14, 22, 28, 35, 41]
[5게임]
1게임: [5, 11, 22, 28, 36, 44]
2게임: [3, 12, 19, 25, 31, 42]
...과제 3
리스트 뒤집기 (두 가지 방법)
목표: 같은 결과를 슬라이싱과 reverse() 두 방식으로 구현한다.
요구사항
- 임의의 리스트(예: [1,2,3,4,5]) 를 뒤집기
- 방법 1: 슬라이싱 [::-1] (원본 유지, 새 리스트)
- 방법 2: .reverse() (제자리)
- 두 결과를 모두 출력
입출력 예시
원본: [1, 2, 3, 4, 5]
방법 1 (슬라이싱): [5, 4, 3, 2, 1]
방법 2 (reverse): [5, 4, 3, 2, 1]
원본 그대로: [5, 4, 3, 2, 1]▶정답 코드 펼치기 / 접기
SOLUTION
original = [1, 2, 3, 4, 5]
print("원본:", original)
# 방법 1: 슬라이싱 — 새 리스트
reversed_slice = original[::-1]
print("방법 1 (슬라이싱):", reversed_slice)
# 방법 2: reverse() — 제자리
original.reverse()
print("방법 2 (reverse):", original)
print("원본 그대로:", original)
▶ 실행 결과
원본: [1, 2, 3, 4, 5]
방법 1 (슬라이싱): [5, 4, 3, 2, 1]
방법 2 (reverse): [5, 4, 3, 2, 1]
원본 그대로: [5, 4, 3, 2, 1]