리스트
항목이 5개인 리스트의 인덱스는 0부터 4까지라서 menu[4]가 마지막 항목이고, menu[5]는 IndexError로 프로그램을 멈춥니다.
변수 하나에 메뉴 전체를 담습니다
급식 식단표에는 하루에 반찬이 여러 가지 나오고, 장보기 목록에도 살 물건이 여러 개 있습니다. dish1, dish2, dish3처럼 반찬마다 변수를 하나씩 만들 수도 있지만, 반찬이 하나만 늘어도 프로그램을 고쳐야 합니다. 리스트는 값 여러 개를 순서대로 변수 하나에 담습니다. 대괄호 안에 값을 쉼표로 나누어 씁니다. 2022 개정 중학교 정보 [9정03-05]가 말하는 「데이터를 순차적으로 저장할 수 있는 구조」가 파이썬에서는 리스트입니다.
menu = ["잡곡밥", "미역국", "불고기", "배추김치", "우유"]
print(menu)
print(len(menu))
print(menu[0], menu[-1])['잡곡밥', '미역국', '불고기', '배추김치', '우유']
5
잡곡밥 우유리스트도 문자열과 같은 인덱스를 씁니다. 첫 항목은 0, 마지막 항목은 -1이고, menu[1:3] 같은 슬라이스도 됩니다. len()은 항목 수를 알려 줍니다. 리스트 전체를 출력하면 대괄호가 함께 나오고 문자열마다 작은따옴표가 붙어서, 항목이 어디서 시작하고 끝나는지 정확히 보입니다.
문자열과 달리 리스트는 바꿀 수 있습니다
문자열은 그 자리에서 고칠 수 없지만 리스트는 됩니다. 인덱스에 대입하면 항목이 바뀝니다. append()는 맨 끝에 항목을 더하고, remove()는 처음 만나는 같은 값을 지우고, pop()은 마지막 항목을 꺼내서 돌려줍니다. in은 어떤 값이 리스트 안에 있는지 확인합니다. 이 메서드들은 리스트 자체를 바꿉니다. 문자열 메서드와 가장 크게 다른 점입니다.
cart = ["eggs", "milk"]
cart.append("tofu")
cart[0] = "ramen"
print(cart)
cart.remove("milk")
last = cart.pop()
print(cart, last)
print("tofu" in cart)['ramen', 'milk', 'tofu']
['ramen'] tofu
False| 이 줄을 실행한 뒤 | cart |
|---|---|
| cart = ["eggs", "milk"] | ['eggs', 'milk'] |
| cart.append("tofu") | ['eggs', 'milk', 'tofu'] |
| cart[0] = "ramen" | ['ramen', 'milk', 'tofu'] |
| cart.remove("milk") | ['ramen', 'tofu'] |
| last = cart.pop() | ['ramen'] (last는 'tofu') |
수 리스트에는 바로 쓰는 도구가 있습니다
수로 된 리스트라면 sum(), min(), max()가 이름 그대로 합계, 가장 작은 값, 가장 큰 값을 줍니다. sorted()는 정렬한 새 리스트를 돌려주고 원래 리스트는 그대로 두지만, 메서드 sort()는 리스트 자체를 정렬하고 아무것도 돌려주지 않습니다. 평균은 합계를 개수로 나눈 값이니 len()을 쓰면 됩니다.
scores = [72, 95, 88, 64, 81]
print(sum(scores), min(scores), max(scores))
print(sum(scores) / len(scores))
print(sorted(scores))
print(scores)400 64 95
80.0
[64, 72, 81, 88, 95]
[72, 95, 88, 64, 81]두 이름이 같은 리스트를 가리킬 수 있습니다
거의 모든 사람이 한 번은 걸리는 부분입니다. b = a를 실행해도 리스트가 두 개가 되지 않습니다. 리스트 하나에 이름이 두 개 붙을 뿐입니다. b를 통해 리스트를 바꾸면 a에서도 바뀐 것이 보입니다. a와 b가 같은 리스트이기 때문입니다. 수와 문자열은 그 자리에서 바뀌지 않으니 이 차이를 느낄 일이 없지만, 리스트에서는 드러납니다. 따로 된 복사본이 필요하면 a.copy()나 슬라이스 a[:]로 만드세요.
a = ["rice", "soup"]
b = a
b.append("kimchi")
print(a)
c = a.copy()
c.append("egg")
print(a)
print(c)['rice', 'soup', 'kimchi']
['rice', 'soup', 'kimchi']
['rice', 'soup', 'kimchi', 'egg']리스트는 반복문과 짝을 이룹니다. 수행평가 점수 30개를 리스트에 담아도, 30줄을 따로 쓰지 않고 하나씩 다 돌아볼 수 있어야 쓸모가 있습니다. 반복문 단원의 for가 그 일을 합니다. 그 전까지는 sum(), min(), max(), len()이 한 번씩 불러 주는 것만으로 리스트 전체를 대신 돌아봐 줍니다.
| 리스트 | [ ] 안에 쉼표로 나눈 값들을 순서대로 담은 것 |
| append(x) | 리스트 끝에 x를 더함 |
| remove(x) | x와 같은 첫 항목을 지움 |
| pop() | 마지막 항목을 꺼내 돌려줌 |
| sorted(list) | 정렬한 새 리스트. 원래 리스트는 그대로 |
| list.sort() | 리스트 자체를 정렬하고 None을 돌려줌 |
| a.copy() | 리스트 a의 따로 된 복사본 |
- 무엇이 출력될까요?
nums = [10, 20, 30, 40] print(nums[2]) - 무엇이 출력될까요?
nums = [10, 20, 30, 40] print(nums[-1] + nums[0]) - 무엇이 출력될까요?
bag = ["pen"] bag.append("ruler") bag.append("eraser") print(len(bag)) - 무엇이 출력될까요?
x = [3, 1, 2] y = sorted(x) print(x, y)[3, 1, 2] [1, 2, 3][1, 2, 3] [1, 2, 3][1, 2, 3] [3, 1, 2][3, 1, 2] None
- 무엇이 출력될까요?
x = [3, 1, 2] y = x.sort() print(x, y)[3, 1, 2] [1, 2, 3][1, 2, 3] [1, 2, 3][1, 2, 3] NoneAn error
- 무엇이 출력될까요?
a = [1, 2] b = a b.append(3) print(a)[1, 2][1, 2, 3][3]An error
- 무엇이 출력될까요?
marks = [70, 90, 80] print(sum(marks) / len(marks)) - 무엇이 출력될까요?
stations = ["Seoul", "Yongsan", "Noryangjin", "Daebang"] print(stations[1:3]) - 무엇이 출력될까요?
stack = ["a", "b", "c"] top = stack.pop() print(top, len(stack)) - 무엇이 출력될까요?
print("milk" in ["eggs", "milk", "tofu"]) - 아래 리스트가 출력되도록 줄을 순서대로 놓으세요.출력
['homework', 'piano']
- 「마지막 항목은 menu[len(menu)]이다.」 항목이 5개면 인덱스는 4까지라서 menu[5]는 IndexError: list index out of range를 냅니다. menu[-1]이나 menu[len(menu) - 1]을 쓰세요.
- 「menu = menu.append(x)라고 써야 바뀐 리스트가 남는다.」 append()는 리스트를 바꾸고 None을 돌려주기 때문에, 이 줄은 리스트를 통째로 None으로 바꿔 버립니다. menu.append(x)만 쓰세요.
- 「b = a로 리스트를 백업해 두었다.」 같은 리스트에 이름을 하나 더 붙였을 뿐입니다. 어느 이름으로 바꿔도 양쪽에 다 보입니다. 진짜 복사본은 b = a.copy()로 만듭니다.
- 리스트는 값을 순서대로 담음: [a, b, c].
- 인덱스와 슬라이스는 문자열과 같고, 마지막 인덱스는 len - 1.
- append, remove, pop, 인덱스 대입은 리스트 자체를 바꿈.
- sorted()는 새 리스트, sort()는 리스트를 바꾸고 None.
- b = a는 같은 리스트를 나눠 씀. 따로 쓰려면 a.copy().
이 과정의 출처 (6)
- Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
- Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
- Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
- General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
- Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
- Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)
확인한 날: 2026-10-19