[파이썬 개념 7] 리스트
학생 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()를 쓴다.
확인 문제
nums = [5, 10, 15, 20, 25]일 때nums[1:3],nums[-2],nums[::2]의 결과는?- 리스트에서 짝수만 골라 새 리스트를 만드는 코드를 반복문으로 쓰세요.
- 다음 코드의 출력은?
a = [1, 2] b = a b[0] = 9 print(a[0])
연습해 보기
확인 문제 정답
[10, 15],20,[5, 15, 25]- 예시
evens = [] for x in nums: if x % 2 == 0: evens.append(x) 9: a와 b는 같은 리스트입니다.
댓글 0
로그인하면 댓글을 쓸 수 있습니다.