🐨CoalaCoding
DocsExamplesTry itBoardB반
🐨CoalaCoding

개발자를 위한 한국어 웹 기술 문서

문서

  • JavaScript
  • Web Publishing
  • React
  • Python

커뮤니티

  • 게시판
  • 예제 모음
  • Try it 에디터

기타

  • GitHub
  • 관리자
© 2026 CoalaCoding. All rights reserved.
  • 01_파이썬 기본문법
  • 02_파이썬 변수
  • 03_파이썬 출력
  • 04_파이썬 기본 자료형
  • 05_파이썬 집합 자료형
  • 00-파이썬 바이브 코딩
  • 1회차: 파이썬 소개 & 변수와 자료형
  • 2회차: 연산자 & 문자열
  • 3회차: 조건문
  • 4회차: 반복문
  • 5회차: 함수(Function)
  • 6회차: 리스트 & 딕셔너리
  • 7회차: 파이썬과 UI연결
  • 01_사진수집
  • 02_네이버 영화 리뷰 크롤링
  • 03_PPT작성
  • 04_이메일전송
  • 05-파이썬 챗봇 만들기
  • 06-주식분석보고서
  • 허깅페이스 무료 Inference API - OTT 앱 활용 가이드
  1. 홈
  2. 문서
  3. Backend
  4. Python
  5. 6회차: 리스트 & 딕셔너리

6회차: 리스트 & 딕셔너리

코드 블록의 Try it Yourself 버튼으로 직접 실행할 수 있다.

구문

6회차: 리스트 & 딕셔너리

선수 학습: 5회차 (함수)


학습 목표

  • 리스트(List)의 개념을 이해하고 다양하게 활용할 수 있다.
  • 딕셔너리(Dictionary)의 개념을 이해하고 다양하게 활용할 수 있다.
  • 리스트와 딕셔너리를 반복문과 함께 사용할 수 있다.
  • 리스트 안에 딕셔너리를 담는 복합 구조를 이해할 수 있다.

6.1. 리스트(List)

6.1.1. 리스트란?

리스트(List)는 여러 개의 값을 순서대로 담는 자료형이다. 대괄호([])를 사용하며, 각 값은 쉼표(,)로 구분한다.

리스트를 일상에 비유하면 번호가 매겨진 서랍장이다. 첫 번째 서랍(0번), 두 번째 서랍(1번), ... 순서대로 물건을 보관하고 번호로 꺼낼 수 있다.

6.1.2. 리스트 선언하기

nums = [10, 20, 30, 40, 50]
names = ["홍길동", "김영희", "이철수"]
mixed = [1, "파이썬", True, 3.14]
empty = []

print(nums)
print(names)
print(mixed)
print(empty)
줄설명
1정수 5개를 담은 리스트이다.
2문자열 3개를 담은 리스트이다.
3리스트는 서로 다른 자료형을 섞어서 담을 수 있다.
4아무것도 없는 빈 리스트이다. 나중에 값을 추가할 때 사용한다.

실행 결과

[10, 20, 30, 40, 50]
['홍길동', '김영희', '이철수']
[1, '파이썬', True, 3.14]
[]

6.1.3. 인덱스로 요소 접근하기

리스트의 각 요소에는 위치를 나타내는 인덱스(Index)가 있다. 인덱스는 0부터 시작한다.

리스트:  ["홍길동", "김영희", "이철수"]
인덱스:      0         1         2
names = ["홍길동", "김영희", "이철수"]

print(names[0])
print(names[1])
print(names[2])
print(names[-1])
print(names[-2])
줄설명
3names[0] 은 인덱스 0, 즉 첫 번째 요소 "홍길동" 이다.
4names[1] 은 두 번째 요소 "김영희" 이다.
5names[2] 는 세 번째 요소 "이철수" 이다.
6names[-1] 은 뒤에서 첫 번째, 즉 마지막 요소 "이철수" 이다.
7names[-2] 는 뒤에서 두 번째 요소 "김영희" 이다.

실행 결과

홍길동
김영희
이철수
이철수
김영희

6.1.4. 리스트 슬라이싱

리스트도 문자열처럼 [시작:끝] 으로 일부분을 잘라낼 수 있다.

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

print(nums[1:4])
print(nums[:3])
print(nums[2:])
print(nums[::2])
줄설명
3인덱스 1~3까지의 요소 [20, 30, 40] 를 반환한다. 끝 인덱스 4는 포함되지 않는다.
4처음부터 인덱스 2까지 [10, 20, 30] 를 반환한다.
5인덱스 2부터 끝까지 [30, 40, 50] 를 반환한다.
6[::2] 는 2칸씩 건너뛰며 [10, 30, 50] 를 반환한다.

실행 결과

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

6.1.5. 리스트 요소 수정하기

인덱스로 특정 위치의 요소를 수정할 수 있다.

items = ["검", "방패", "화살"]
print("수정 전:", items)

items[1] = "갑옷"
print("수정 후:", items)
줄설명
13개 아이템을 담은 리스트를 선언한다.
4items[1] 은 두 번째 요소이다. "방패" 를 "갑옷" 으로 바꾼다.

실행 결과

수정 전: ['검', '방패', '화살']
수정 후: ['검', '갑옷', '화살']

6.1.6. 리스트 주요 메서드(Method)

items = ["검", "방패"]
print("초기:", items)

items.append("화살")
print("append 후:", items)

items.insert(1, "갑옷")
print("insert 후:", items)

items.remove("방패")
print("remove 후:", items)

popped = items.pop()
print("pop 후:", items)
print("꺼낸 값:", popped)

items.sort()
print("sort 후:", items)

print("길이:", len(items))
줄설명
4append("화살"): 리스트 끝에 "화살" 을 추가한다.
7insert(1, "갑옷"): 인덱스 1번 자리에 "갑옷" 을 삽입한다. 기존 요소들은 뒤로 밀린다.
10remove("방패"): "방패" 값을 찾아 첫 번째로 발견된 것을 삭제한다.
13pop(): 마지막 요소를 삭제하고 그 값을 반환한다. popped 에 저장된다.
17sort(): 리스트를 오름차순으로 정렬한다. 문자열이면 가나다순이다.
20len(items): 현재 리스트의 요소 개수를 반환한다.

6.1.7. 리스트와 for 반복문

scores = [85, 92, 78, 95, 60]
total = 0

for s in scores:
    total += s

avg = total / len(scores)
print(f"합계: {total}")
print(f"평균: {avg:.1f}")
print(f"최고점: {max(scores)}")
print(f"최저점: {min(scores)}")
줄설명
1~2점수 리스트와 합계 변수를 선언한다.
4~5리스트의 각 점수를 s 에 담으며 반복한다. 매 반복마다 total 에 s 를 더한다.
7합계를 점수 개수로 나누어 평균을 계산한다.
8~11합계, 평균, 최고점, 최저점을 출력한다. max(), min() 은 리스트의 최댓값과 최솟값을 반환하는 내장 함수이다.

실행 결과

합계: 410
평균: 82.0
최고점: 95
최저점: 60

6.2. 딕셔너리(Dictionary)

6.2.1. 딕셔너리란?

딕셔너리(Dictionary)는 키(Key) 와 값(Value) 의 쌍으로 데이터를 저장하는 자료형이다. 중괄호({})를 사용한다.

실사전에서 단어(키)를 찾으면 그 뜻(값)을 알 수 있는 것과 같은 구조이다.

리스트는 순서(번호)로 접근하지만, 딕셔너리는 이름(키) 으로 접근한다.

6.2.2. 딕셔너리 선언하기

char = {
    "name": "홍길동",
    "job": "전사",
    "lv": 30,
    "hp": 1200.0,
    "is_alive": True
}

print(char)
줄설명
1중괄호 {} 로 딕셔너리를 시작한다.
2~6키: 값 형식으로 각 항목을 작성한다. 키는 주로 문자열을 사용한다.
7중괄호 } 로 딕셔너리를 닫는다.

6.2.3. 값 읽기

딕셔너리[키] 형식으로 값을 읽는다.

char = {"name": "홍길동", "job": "전사", "lv": 30}

print(char["name"])
print(char["job"])
print(char["lv"])
줄설명
3char["name"] 은 키 "name" 에 해당하는 값 "홍길동" 을 반환한다.
4키 "job" 에 해당하는 값 "전사" 를 반환한다.
5키 "lv" 에 해당하는 값 30 을 반환한다.

실행 결과

홍길동
전사
30
⚠️WARNING

존재하지 않는 키를 사용하면 KeyError 오류가 발생한다. 키가 있는지 확인할 때는 in 연산자를 사용한다. "name" in char 처럼 쓰면 키가 있으면 True, 없으면 False 를 반환한다.

6.2.4. get() 메서드로 안전하게 읽기

get() 메서드는 키가 없을 때 오류 대신 기본값(기본은 None)을 반환한다.

char = {"name": "홍길동", "lv": 30}

print(char.get("name"))
print(char.get("job"))
print(char.get("job", "직업 없음"))
줄설명
3키 "name" 이 있으므로 "홍길동" 을 반환한다.
4키 "job" 이 없으므로 None 을 반환한다. 오류가 발생하지 않는다.
5두 번째 인수로 기본값 "직업 없음" 을 지정했으므로 키가 없을 때 "직업 없음" 을 반환한다.

실행 결과

홍길동
None
직업 없음

6.2.5. 값 추가, 수정, 삭제

char = {"name": "홍길동", "lv": 30}
print("초기:", char)

char["lv"] = 31
print("수정:", char)

char["job"] = "전사"
print("추가:", char)

del char["name"]
print("삭제:", char)
줄설명
4이미 있는 키 "lv" 에 새 값 31 을 대입하면 기존 값이 수정된다.
7없는 키 "job" 에 값을 대입하면 새 항목이 추가된다.
10del 딕셔너리[키] 로 해당 키-값 쌍을 삭제한다.

실행 결과

초기: {'name': '홍길동', 'lv': 30}
수정: {'name': '홍길동', 'lv': 31}
추가: {'name': '홍길동', 'lv': 31, 'job': '전사'}
삭제: {'lv': 31, 'job': '전사'}

6.2.6. 딕셔너리 주요 메서드

char = {"name": "홍길동", "job": "전사", "lv": 30}

print(char.keys())
print(char.values())
print(char.items())
print("lv" in char)
print("hp" in char)
줄설명
3keys() : 딕셔너리의 모든 키를 반환한다.
4values() : 딕셔너리의 모든 값을 반환한다.
5items() : 딕셔너리의 모든 키-값 쌍을 (키, 값) 형태로 반환한다.
6"lv" in char : 키 "lv" 가 딕셔너리에 있으면 True 를 반환한다.
7"hp" in char : 키 "hp" 가 없으므로 False 를 반환한다.

실행 결과

dict_keys(['name', 'job', 'lv'])
dict_values(['홍길동', '전사', 30])
dict_items([('name', '홍길동'), ('job', '전사'), ('lv', 30)])
True
False

6.2.7. 딕셔너리와 for 반복문

char = {"name": "홍길동", "job": "전사", "lv": 30, "hp": 1200}

print("[ 키만 반복 ]")
for k in char.keys():
    print(k)

print("[ 값만 반복 ]")
for v in char.values():
    print(v)

print("[ 키-값 동시 반복 ]")
for k, v in char.items():
    print(f"{k}: {v}")
줄설명
4keys() 로 키만 반복한다.
8values() 로 값만 반복한다.
12items() 로 키와 값을 동시에 반복한다. k 에 키, v 에 값이 담긴다.

실행 결과

[ 키만 반복 ]
name
job
lv
hp
[ 값만 반복 ]
홍길동
전사
30
1200
[ 키-값 동시 반복 ]
name: 홍길동
job: 전사
lv: 30
hp: 1200

6.3. 리스트 안에 딕셔너리 담기

6.3.1. 복합 구조란?

실제 프로그램에서는 여러 사람의 정보를 관리해야 한다. 이때 리스트 안에 딕셔너리를 넣는 복합 구조를 사용한다.

students = [
    {"name": "홍길동", "score": 88},
    {"name": "김영희", "score": 95},
    {"name": "이철수", "score": 72},
]

이 구조는 아래처럼 생각하면 된다.

  • students : 전체 학생 리스트
  • students[0] : 첫 번째 학생 딕셔너리 {"name": "홍길동", "score": 88}
  • students[0]["name"] : 첫 번째 학생의 이름 "홍길동"
  • students[0]["score"] : 첫 번째 학생의 점수 88

6.3.2. 복합 구조 접근하기

students = [
    {"name": "홍길동", "score": 88},
    {"name": "김영희", "score": 95},
    {"name": "이철수", "score": 72},
]

print(students[0])
print(students[0]["name"])
print(students[1]["score"])
줄설명
7students[0] 은 첫 번째 딕셔너리 전체를 반환한다.
8students[0]["name"] 은 첫 번째 딕셔너리의 "name" 키 값을 반환한다.
9students[1]["score"] 는 두 번째 딕셔너리의 "score" 키 값을 반환한다.

실행 결과

{'name': '홍길동', 'score': 88}
홍길동
95

6.3.3. 복합 구조와 for 반복문

students = [
    {"name": "홍길동", "score": 88},
    {"name": "김영희", "score": 95},
    {"name": "이철수", "score": 72},
]

for stu in students:
    print(f"{stu['name']}: {stu['score']}점")
줄설명
7반복마다 stu 에 각 딕셔너리가 담긴다. 첫 번째 반복에서 stu = {"name": "홍길동", "score": 88} 이다.
8stu['name'] 과 stu['score'] 로 딕셔너리의 값에 접근한다. f-string 안에서 따옴표를 쓸 때는 작은따옴표(')를 사용한다.

실행 결과

홍길동: 88점
김영희: 95점
이철수: 72점

6.4. 종합 예제: 학생 성적 관리 프로그램

students = [
    {"name": "홍길동", "kor": 80, "math": 90, "eng": 85},
    {"name": "김영희", "kor": 95, "math": 88, "eng": 92},
    {"name": "이철수", "kor": 70, "math": 75, "eng": 68},
]

print("===== 성적표 =====")

for stu in students:
    total = stu["kor"] + stu["math"] + stu["eng"]
    avg = total / 3
    print(f"{stu['name']}: 국어 {stu['kor']} / 수학 {stu['math']} / 영어 {stu['eng']} | 평균 {avg:.1f}")

print("------------------")

all_avgs = []
for stu in students:
    avg = (stu["kor"] + stu["math"] + stu["eng"]) / 3
    all_avgs.append(avg)

best_idx = all_avgs.index(max(all_avgs))
print(f"전체 평균 1등: {students[best_idx]['name']} ({max(all_avgs):.1f}점)")
줄설명
1~5학생 3명의 국어, 수학, 영어 점수를 리스트 안의 딕셔너리 형태로 저장한다.
9~12각 학생의 세 과목 합계와 평균을 계산하여 출력한다.
15~18각 학생의 평균을 all_avgs 리스트에 추가한다.
20max(all_avgs) 로 최고 평균을 구하고, index() 로 그 위치(인덱스)를 찾는다.
21가장 높은 평균을 가진 학생의 이름과 점수를 출력한다.

실행 결과

===== 성적표 =====
홍길동: 국어 80 / 수학 90 / 영어 85 | 평균 85.0
김영희: 국어 95 / 수학 88 / 영어 92 | 평균 91.7
이철수: 국어 70 / 수학 75 / 영어 68 | 평균 71.0
------------------
전체 평균 1등: 김영희 (91.7점)

6.5. 실습 과제

과제 1. 나만의 영어 단어장

단어(영어)와 뜻(한국어)을 딕셔너리에 5개 이상 저장하고, 아래처럼 목록을 출력한다.

===== 단어장 =====
apple: 사과
banana: 바나나
...
총 5개의 단어

과제 2. 쇼핑몰 장바구니 프로그램

상품 이름과 가격을 담은 딕셔너리를 리스트에 3개 이상 저장하고, 전체 목록 출력 후 가장 저렴한 상품과 가장 비싼 상품, 총 금액을 출력한다.


목차

  • 구문