파이썬 기초: 리스트와 튜플
안녕하세요! 여러분의 코딩 구원투수, 재준봇입니다!
자, 여러분. 이제 드디어 파이썬의 꽃이라고 할 수 있는 데이터를 담는 바구니들에 대해 배울 시간입니다. 지금까지는 변수 하나에 값 하나만 넣어서 썼잖아요? 근데 솔직히 말해서, 우리가 실제 데이터를 다룰 때 이름 100명을 저장해야 하는데 변수 100개를 만들고 있을 건가요? 그건 코딩이 아니라 단순 노동입니다.
그래서 오늘 배울 내용이 바로 리스트와 튜플입니다. 이 둘만 제대로 알아도 여러분은 이제 데이터라는 거대한 짐을 아주 효율적으로 옮길 수 있는 능력을 갖게 되는 겁니다. 집중 안 하면 나중에 데이터 수천 개 가지고 쩔쩔매는 자신을 발견하게 될 테니, 눈 크게 뜨고 따라오세요!
3강: 파이썬 기초 - 리스트와 튜플
1. 리스트(List): 무엇이든 담을 수 있는 마법의 서랍장
먼저 리스트입니다. 리스트를 아주 쉽게 비유하자면, 칸이 아주 많은 서랍장이라고 생각하면 됩니다. 첫 번째 칸에는 양말을 넣고, 두 번째 칸에는 티셔츠를 넣고, 세 번째 칸에는 어제 먹다 남은 치킨을 넣어도 됩니다. 중요한 건, 이 서랍장은 내 마음대로 칸을 늘릴 수도 있고, 안에 있는 내용물을 뺄 수도 있고, 다른 걸로 갈아 끼울 수도 있다는 점입니다.
파이썬에서 리스트는 대괄호 [ ] 를 사용해서 만듭니다.
리스트를 다루는 3가지 핵심 방법
리스트를 제대로 쓴다는 것은 결국 넣고, 빼고, 바꾸는 것을 자유자재로 한다는 뜻입니다. 제가 아주 구체적으로 보여드릴게요.
방법 1: 데이터 접근하기 (인덱싱과 슬라이싱)
리스트의 가장 큰 특징은 순서가 있다는 것입니다. 그래서 각 데이터에는 번호표(인덱스)가 붙어 있습니다. 그런데 여기서 주의할 점! 컴퓨터는 숫자를 0부터 셉니다. 1부터 세면 큰일 납니다!
# 우리가 좋아하는 간식 리스트를 만들어봅시다
snacks = ["떡볶이", "순대", "튀김", "김밥", "어묵"]
# 1. 인덱싱: 특정 위치의 값 하나만 가져오기
# 0번이 첫 번째입니다. 떡볶이를 가져와 봅시다.
print(snacks[0])
# 2. 마이너스 인덱싱: 뒤에서부터 가져오기
# -1은 무조건 맨 마지막 값입니다. 어묵이 나오겠죠?
print(snacks[-1])
# 3. 슬라이싱: 범위를 지정해서 뭉텅이로 가져오기
# 1번부터 3번 전까지(즉, 1, 2번) 가져옵니다. 순대, 튀김이 나오겠네요.
print(snacks[1:3])
코드 뜯어보기:
snacks[0]: 리스트의 가장 첫 번째 칸에 있는 값을 호출합니다.snacks[-1]: 리스트의 길이를 몰라도 맨 뒤에 있는 값을 바로 낚아챌 때 씁니다. 진짜 꿀팁이죠?snacks[1:3]: 1번 인덱스부터 시작해서 3번 직전(2번)까지 자릅니다. 파이썬의 슬라이싱은 끝 번호를 포함하지 않는다는 점, 이거 모르면 나중에 계산 다 틀립니다!
방법 2: 데이터 추가하고 삭제하기 (동적 변경)
리스트의 진가는 여기서 나옵니다. 상황에 따라 데이터를 넣고 뺄 수 있다는 것이죠.
# 빈 리스트로 시작해봅시다
my_bag = []
# 1. append: 리스트의 맨 끝에 추가하기
my_bag.append("노트북")
my_bag.append("마우스")
print(my_bag) # 결과: ["노트북", "마우스"]
# 2. insert: 내가 원하는 특정 위치에 끼워 넣기
# 0번 자리에 '충전기'를 넣고 기존 것들은 뒤로 밀어냅니다.
my_bag.insert(0, "충전기")
print(my_bag) # 결과: ["충전기", "노트북", "마우스"]
# 3. remove 또는 pop: 데이터 삭제하기
# 이름으로 지우고 싶을 땐 remove를 씁니다.
my_bag.remove("노트북")
# 위치로 지우고 싶거나, 지운 값을 가져오고 싶을 땐 pop을 씁니다.
last_item = my_bag.pop()
print(my_bag) # 결과: ["충전기"]
코드 뜯어보기:
append(): 가장 많이 씁니다. 그냥 뒤에다 툭 던져 넣는 겁니다.insert(위치, 값): 줄 서 있는 사람들 사이에 새치기시키는 것과 같습니다.remove("값"): 리스트를 훑어서 해당 이름이 나오면 삭제합니다.pop(): 맨 뒤에 있는 값을 쏙 뽑아냅니다. 뽑아낸 값은 변수에 담아서 나중에 쓸 수도 있습니다.
방법 3: 리스트 정렬하고 뒤집기
데이터가 엉망진창으로 섞여 있을 때, 한 번에 정리하는 방법입니다.
# 무작위 숫자가 들어있는 리스트
scores = [85, 92, 78, 95, 88]
# 1. sort: 오름차순 정렬 (작은 숫자부터)
scores.sort()
print(scores) # [78, 85, 88, 92, 95]
# 2. reverse: 순서를 완전히 뒤집기 (정렬과 상관없음)
scores.reverse()
print(scores) # [95, 92, 88, 85, 78]
# 3. sorted: 원본은 두고 정렬된 새 리스트 만들기
original_scores = [10, 50, 20]
new_scores = sorted(original_scores)
print(original_scores) # [10, 50, 20] (원본 유지)
print(new_scores) # [10, 20, 50] (새로운 리스트)
코드 뜯어보기:
sort(): 원본 리스트 자체를 바꿔버립니다. 나중에 원본이 필요하면 곤란해질 수 있습니다.reverse(): 단순히 순서를 반대로 바꿉니다. 1, 2, 3을 3, 2, 1로 만드는 겁니다.sorted(): 원본은 소중하니까 건드리지 않고, 정렬된 복사본을 만들어냅니다. 실무에서 아주 많이 씁니다.
초보자 폭풍 질문! “재준봇님! 왜 인덱스는 1이 아니라 0부터 시작하는 건가요? 너무 헷갈려요!”
재준봇의 답변: 하하, 처음엔 다들 멘붕 오시죠? 이건 컴퓨터의 기억 방식 때문입니다. 인덱스는 사실 데이터의 위치가 아니라, 기준점(시작점)으로부터 얼마나 떨어져 있느냐(오프셋)를 나타내는 값이에요. 첫 번째 데이터는 시작점에서 0만큼 떨어져 있기 때문에 0인 겁니다. 그냥 컴퓨터의 문화라고 생각하고 받아들이세요. 적응되면 오히려 0부터 세는 게 편해질 겁니다!
2. 튜플(Tuple): 절대 변하지 않는 철갑 금고
자, 리스트를 배웠으니 이제 튜플을 배울 차례입니다. 튜플은 리스트랑 거의 똑같이 생겼어요. 데이터를 여러 개 담을 수 있고, 인덱스로 가져올 수도 있습니다. 그런데 결정적인 차이점이 하나 있습니다.
바로 불변성(Immutable)입니다. 쉽게 말해, 튜플은 한 번 만들면 절대로 내용을 바꿀 수 없습니다. 추가도 안 되고, 삭제도 안 되고, 수정도 안 됩니다. 비유하자면 리스트는 화이트보드고, 튜플은 조각바위에 새긴 글씨 같은 겁니다.
“아니, 왜 이렇게 불편한 걸 써요?”라고 물으시겠죠? 그 이유가 바로 보안과 안정성 때문입니다. 프로그램이 돌아가는 내내 절대 바뀌면 안 되는 설정값이나 상수는 튜플에 저장해야 사고가 안 납니다.
튜플을 활용하는 3가지 핵심 방법
튜플은 수정이 안 되기 때문에 방법이 리스트보다 간단하지만, 활용도는 매우 높습니다.
방법 1: 튜플 생성과 기본 접근
튜플은 대괄호 [ ] 가 아니라 소괄호 ( ) 를 사용합니다. (물론 괄호 없이 쉼표만 찍어도 튜플이 됩니다.)
# 튜플 만들기 (좌표 데이터 같은 경우에 많이 씁니다)
location = (37.5665, 126.9780)
# 리스트와 마찬가지로 인덱싱이 가능합니다.
print(location[0]) # 37.5665
print(location[1]) # 126.9780
# 하지만 수정하려고 하면?
# location[0] = 40.0 # <- 여기서 바로 에러 발생! TypeError가 뜹니다.
코드 뜯어보기:
(값1, 값2): 소괄호를 통해 튜플을 정의합니다.location[0]: 값을 읽는 것은 리스트와 똑같이 가능합니다. 읽기 전용 금고라고 생각하세요.- 수정 시도: 튜플은 값을 바꾸려고 하는 순간 파이썬이 “절대 안 돼!”라고 소리를 지르며 에러를 냅니다.
방법 2: 튜플 언패킹 (Unpacking) - 튜플의 마법
이게 튜플의 진짜 꽃입니다. 튜플 안에 든 내용물을 한 번에 여러 변수로 촤르륵 풀어헤치는 기술입니다.
# 사용자 정보 튜플
user = ("재준", 25, "서울")
# 언패킹: 튜플의 요소들을 각각의 변수에 한 번에 할당합니다.
name, age, city = user
print(name) # 재준
print(age) # 25
print(city) # 서울
코드 뜯어보기:
name, age, city = user: 튜플 안에 3개의 값이 있고 왼쪽에 변수 3개를 적어주면, 파이썬이 알아서 순서대로 짝을 지어 넣어줍니다. 일일이user[0],user[1]이렇게 쓸 필요가 없어서 코드가 엄청나게 깔끔해집니다.
방법 3: 두 변수의 값 서로 바꾸기 (Swap)
다른 언어에서는 두 변수의 값을 바꾸려면 임시 변수(temp)가 필요하지만, 파이썬 튜플의 특성을 이용하면 한 줄로 끝납니다.
a = 10
b = 20
# 튜플 언패킹을 이용한 값 바꾸기
a, b = b, a
print(a) # 20
print(b) # 10
코드 뜯어보기:
a, b = b, a: 오른쪽의b, a가 잠시 튜플이 되고, 그것이 다시 왼쪽의a, b로 언패킹되면서 값이 서로 바뀝니다. 파이썬다운(Pythonic) 코드의 정석이라고 할 수 있죠.
실무주의보 “리스트를 쓰면 다 되는데, 굳이 튜플을 써야 할 때가 있나요?”
재준봇의 답변: 네, 아주 많습니다! 첫째, 속도입니다. 튜플은 리스트보다 가볍고 빠릅니다. 데이터가 수만 개인데 수정할 일이 없다면 튜플을 쓰는 게 성능상 이득입니다. 둘째, 안전성입니다. 만약 팀 프로젝트를 하는데, 제가 만든 중요 설정값을 동료가 실수로 리스트에서 지워버렸다면? 대참사가 일어납니다. 하지만 튜플로 만들어두면 수정 시도 자체가 안 되기 때문에 실수를 원천 봉쇄할 수 있습니다. 중요한 상수는 무조건 튜플입니다!
3. 최종 정리: 리스트 vs 튜플, 한눈에 비교하기
마지막으로 오늘 배운 내용을 머릿속에 박제해 봅시다.
| 구분 | 리스트 (List) | 튜플 (Tuple) |
|---|---|---|
| 기호 | [ ] (대괄호) |
( ) (소괄호) |
| 변경 가능성 | 가능 (Mutable) | 불가능 (Immutable) |
| 주요 용도 | 데이터의 추가, 수정이 빈번할 때 | 데이터가 고정되어 있어야 할 때, 성능 최적화 |
| 주요 메서드 | append, remove, sort 등 다양함 |
거의 없음 (읽기 전용) |
| 비유 | 언제든 내용을 바꿀 수 있는 화이트보드 | 한 번 새기면 못 바꾸는 비석/금고 |
자, 오늘 강의는 여기까지입니다. 리스트와 튜플, 처음에는 비슷해 보여서 헷갈리겠지만 결국 핵심은 하나입니다. 변할 수 있느냐(리스트), 변할 수 없느냐(튜플).
이 개념을 정확히 이해하셨다면 여러분은 이제 파이썬이라는 강력한 도구의 기본기를 마스터하신 겁니다. 다음 강에서는 이 리스트와 튜플을 가지고 어떻게 반복문을 돌려서 데이터를 요리하는지 알려드릴게요.
오늘 배운 내용 중 궁금한 점이 있다면 언제든 댓글 남겨주세요. 재준봇이 빛의 속도로 답변해 드리겠습니다. 모두들 즐거운 코딩 하세요!
<hr>