[파이썬 개념 7] 리스트

2026-11-09 21:37 ·수정 2026-11-10 11:44

학생 30명의 점수를 변수 30개에 하나씩 담을 수는 없습니다. 여러 값을 순서대로 한곳에 담는 자료형이 리스트입니다.
리스트는 반복문과 함께 쓸 때 진가를 발휘합니다.

1. 리스트 만들기

scores = [80, 95, 70]
names = ["푸름", "소담", "보람"]
mixed = [17, "푸름", 3.5, True]
empty = []
print(scores, names, mixed, empty)
print(len(scores), len(empty))

실행 결과

[80, 95, 70] ['푸름', '소담', '보람'] [17, '푸름', 3.5, True] []
3 0
  • 대괄호 [ ] 안에 값을 쉼표로 나누어 씁니다.
  • 자료형이 다른 값을 섞을 수 있지만, 보통은 같은 종류끼리 담습니다.
  • len() 은 값의 개수입니다.

2. 인덱스로 하나 꺼내기

리스트의 각 값에는 번호가 있고, 이를 인덱스라고 합니다. 0부터 시작합니다.

값 80 95 70 88
인덱스 0 1 2 3
음수 인덱스 -4 -3 -2 -1
scores = [80, 95, 70, 88]
print(scores[0], scores[3])
print(scores[-1], scores[-2])
print(scores[len(scores) - 1])

실행 결과

80 88
88 70
88

마지막 값은 scores[-1] 또는 scores[len(scores) - 1] 입니다.

scores = [80, 95, 70, 88]
print(scores[4])

실행 결과

IndexError: list index out of range

값이 4개이면 인덱스는 0부터 3까지입니다. IndexError 는 반복문의 범위를 하나 넘게 잡았을 때 자주 납니다.

3. 슬라이싱: 여러 개 잘라 내기

리스트[시작:끝] 은 시작부터 끝 바로 앞까지 잘라 새 리스트를 만듭니다. range 처럼 끝은 포함하지 않습니다.

nums = [10, 20, 30, 40, 50]
print(nums[1:4])
print(nums[:2])
print(nums[3:])
print(nums[::-1])

실행 결과

[20, 30, 40]
[10, 20]
[40, 50]
[50, 40, 30, 20, 10]

[::-1] 은 거꾸로 뒤집은 리스트입니다.

4. 값 바꾸기, 넣기, 빼기

scores = [80, 95, 70]
scores[1] = 90            # 바꾸기
scores.append(100)        # 맨 뒤에 넣기
scores.insert(0, 60)      # 0번 자리에 넣기
print(scores)
scores.remove(70)         # 값 70을 찾아서 빼기
last = scores.pop()       # 맨 뒤 값을 꺼내며 빼기
print(scores, last)

실행 결과

[60, 80, 90, 70, 100]
[60, 80, 90] 100
기능 하는 일
리스트[i] = 값 i번 값을 바꾼다
append(값) 맨 뒤에 넣는다
insert(i, 값) i번 자리에 넣는다
remove(값) 그 값을 찾아 처음 것 하나를 뺀다
pop() 맨 뒤 값을 꺼내며 뺀다

빈 리스트를 만들고 append 로 하나씩 채우는 모양을 가장 많이 씁니다.

evens = []
for i in range(1, 11):
    if i % 2 == 0:
        evens.append(i)
print(evens)

실행 결과

[2, 4, 6, 8, 10]

5. 리스트와 반복문

scores = [80, 95, 70]

for s in scores:                 # 방법 1: 값을 차례로
    print(s, end=" ")
print()

for i in range(len(scores)):     # 방법 2: 인덱스로
    print(i, scores[i])

for i, s in enumerate(scores):   # 방법 3: 인덱스와 값을 함께
    print(i, s)

실행 결과

80 95 70 
0 80
1 95
2 70
0 80
1 95
2 70
방법 언제
for s in 리스트 값만 필요할 때
for i in range(len(리스트)) 위치가 필요하거나, 두 리스트를 같은 위치끼리 비교할 때
for i, s in enumerate(리스트) 위치와 값이 둘 다 필요할 때

두 리스트를 같은 위치끼리 비교하는 예입니다.

real = ["cat", "dog", "dog", "cat"]
pred = ["cat", "dog", "cat", "cat"]
ok = 0
for i in range(len(real)):
    if real[i] == pred[i]:
        ok += 1
print(ok, "개 맞음")

실행 결과

3 개 맞음

6. 자주 쓰는 함수와 기능

기능 하는 일
len(리스트) 개수
sum(리스트) 합계
max(리스트), min(리스트) 가장 큰 값, 가장 작은 값
리스트.sort() 작은 것부터 정렬 (리스트 자체가 바뀜)
리스트.sort(reverse=True) 큰 것부터 정렬
sorted(리스트) 정렬한 새 리스트를 돌려줌 (원래 리스트는 그대로)
리스트.count(값) 그 값의 개수
리스트.index(값) 그 값이 처음 나오는 위치
값 in 리스트 들어 있는지
nums = [3, 1, 4, 1, 5, 9]
print(sum(nums), max(nums), min(nums))
print(sorted(nums), nums)
nums.sort(reverse=True)
print(nums)
print(nums.count(1), nums.index(5), 7 in nums)

실행 결과

23 9 1
[1, 1, 3, 4, 5, 9] [3, 1, 4, 1, 5, 9]
[9, 5, 4, 3, 1, 1]
2 1 False

7. 직접 구현해 보기

함수 하나로 끝나는 일도 직접 짜 보면 반복문과 조건문을 깊이 이해하게 됩니다. 가장 큰 값과 그 위치를 찾아봅시다.

scores = [72, 95, 88, 95, 60]
best = scores[0]
pos = 0
for i in range(1, len(scores)):
    if scores[i] > best:
        best = scores[i]
        pos = i
print(best, pos)

실행 결과

95 1

> 를 썼기 때문에 같은 값이 다시 나와도 바꾸지 않아 처음 위치 1이 남습니다. >= 로 바꾸면 마지막 위치 3이 남습니다.

8. 리스트 복사의 함정

a = [1, 2, 3]
b = a
b.append(4)
print(a)

실행 결과

[1, 2, 3, 4]

b = a 는 복사가 아니라 같은 리스트에 이름표를 하나 더 붙인 것입니다. 그래서 b를 바꾸면 a도 바뀝니다.
따로 만들려면 a.copy() 또는 a[:] 를 씁니다.

a = [1, 2, 3]
b = a.copy()
b.append(4)
print(a, b)

실행 결과

[1, 2, 3] [1, 2, 3, 4]

9. 2차원 리스트

리스트 안에 리스트를 넣으면 표를 표현할 수 있습니다. 표[줄][칸] 으로 꺼냅니다.

table = [[90, 80, 70],
         [60, 75, 85]]
print(table[1][2])
for row in table:
    print(sum(row))

실행 결과

85
240
220

10. 문자열은 글자의 리스트처럼

문자열도 인덱스와 슬라이싱을 쓸 수 있습니다. 다만 글자를 직접 바꿀 수는 없습니다.

word = "python"
print(word[0], word[-1], word[1:4], word[::-1])
print(word.upper(), word.count("o"), word.replace("py", "PY"))

실행 결과

p n yth nohtyp
PYTHON 1 PYthon

11. 리스트를 짧게 만들기 (리스트 내포)

반복문으로 리스트를 만드는 일을 한 줄로 줄여 쓸 수 있습니다. 익숙해진 뒤에 쓰면 됩니다.

squares = [i * i for i in range(1, 6)]
evens = [x for x in [3, 8, 2, 7, 10] if x % 2 == 0]
print(squares, evens)

실행 결과

[1, 4, 9, 16, 25] [8, 2, 10]

정리

  • 인덱스는 0부터, 마지막은 -1. 범위를 넘으면 IndexError.
  • 슬라이싱 [시작:끝] 은 끝을 포함하지 않는다.
  • append 로 채우고, for 로 하나씩 꺼낸다.
  • sum, max, min, sort, count, in 을 기억한다.
  • b = a 는 복사가 아니다. a.copy() 를 쓴다.

확인 문제

  1. nums = [5, 10, 15, 20, 25] 일 때 nums[1:3], nums[-2], nums[::2] 의 결과는?
  2. 리스트에서 짝수만 골라 새 리스트를 만드는 코드를 반복문으로 쓰세요.
  3. 다음 코드의 출력은?
    a = [1, 2]
    b = a
    b[0] = 9
    print(a[0])

연습해 보기

확인 문제 정답

  1. [10, 15], 20, [5, 15, 25]
  2. 예시
    evens = []
    for x in nums:
     if x % 2 == 0:
         evens.append(x)
  3. 9 : a와 b는 같은 리스트입니다.

댓글 0

로그인하면 댓글을 쓸 수 있습니다.