리스트, 튜플, 슬라이싱
고전적인 코딩 문제의 실습 예제로 Python 리스트 연산, 슬라이싱 문법, 튜플의 불변성을 익힙니다.
리스트, 튜플, 슬라이싱은(는) CoddyKit의 무료 DSA Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 DSA Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. DSA Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
파이썬 리스트: 동적 배열
파이썬 리스트는 무엇이든 담을 수 있고 스스로 커지는 동적 배열입니다. 순서가 있고 변경할 수 있으며, 인덱스를 사용해 O(1) 시간에 즉시 접근할 수 있습니다. 코드에서 기본 사용법을 보여 줍니다.
nums = [3, 1, 4, 1, 5]
print(nums[0]) # 3
print(nums[-1]) # 5 (last element)
nums.append(9)
print(len(nums)) # 6일반적인 리스트 연산
다음 연산은 반드시 익혀 두십시오. 끝에 append하고 pop하는 연산은 O(1)이지만, 앞에 insert하는 연산은 O(n)입니다. 반복문 안에서 remove를 사용하지 마십시오. 매번 전체를 다시 탐색하기 때문입니다.
stack = []
stack.append(1)
stack.append(2)
stack.append(3)
print(stack.pop()) # 3 O(1)
print(stack) # [1, 2]
# insert at index 0 is O(n)
stack.insert(0, 0)
print(stack) # [0, 1, 2]슬라이싱 문법 설명
슬라이싱은 lst[start:stop:step] 형태로 읽으며 stop 바로 앞에서 멈춥니다. 대표적인 요령은 step을 -1로 지정해 리스트를 변경하지 않고 뒤집는 것입니다. 코드에서 각 형태를 차례로 살펴봅니다.
a = [0, 1, 2, 3, 4, 5]
print(a[1:4]) # [1, 2, 3]
print(a[:3]) # [0, 1, 2]
print(a[3:]) # [3, 4, 5]
print(a[::2]) # [0, 2, 4] every other
print(a[::-1]) # [5, 4, 3, 2, 1, 0] reversed슬라이싱은 얕은 복사본을 만듭니다
알아 두어야 할 함정이 있습니다. 슬라이싱은 항상 새 리스트를 만듭니다. 따라서 슬라이스를 수정해도 원본은 그대로입니다. 하지만 얕은 복사이므로 내부의 중첩 리스트는 여전히 공유됩니다. 주의하십시오.
original = [1, 2, 3]
copy = original[:] # shallow copy
copy[0] = 99
print(original) # [1, 2, 3] unchanged
# Nested list pitfall
nested = [[1, 2], [3, 4]]
shallow = nested[:]
shallow[0][0] = 99
print(nested) # [[99, 2], [3, 4]] changed!튜플: 변경할 수 없는 시퀀스
튜플은 괄호를 사용하며 한 번 만들고 나면 변경할 수 없습니다. 해시 가능하므로 딕셔너리 키나 집합의 원소가 될 수 있어, 격자 문제의 (row, col) 쌍에 안성맞춤입니다.
point = (3, 7)
print(point[0]) # 3
# Use as dict key
grid = {}
grid[(0, 0)] = 'start'
grid[(2, 3)] = 'end'
print(grid[(0, 0)]) # start
# Unpacking
x, y = point
print(x, y) # 3 7튜플과 리스트 중 언제 무엇을 사용할까
데이터가 변경되지 않아야 한다면 튜플을, 변경되어야 한다면 리스트를 선택하십시오. 튜플은 메모리도 조금 덜 사용하므로, 다익스트라 알고리즘의 큰 힙 안에서는 그 차이가 누적됩니다.
import sys
a_list = [1, 2, 3, 4, 5]
a_tuple = (1, 2, 3, 4, 5)
print(sys.getsizeof(a_list)) # e.g. 104 bytes
print(sys.getsizeof(a_tuple)) # e.g. 80 bytes
# Tuple returned from function
def min_max(nums):
return min(nums), max(nums)
lo, hi = min_max([3, 1, 4, 1, 5])
print(lo, hi) # 1 5슬라이싱의 경계 초과 오류
경계 초과 오류는 배열 문제에서 가장 흔한 함정입니다. lst[i:j]가 정확히 j-i개의 항목을 반환한다는 점을 기억하십시오. 중간에서 나누려면 왼쪽은 lst[:mid], 오른쪽은 lst[mid:]입니다.
lst = [1, 2, 3, 4, 5, 6]
mid = len(lst) // 2 # 3
left = lst[:mid] # [1, 2, 3]
right = lst[mid:] # [4, 5, 6]
print(left, right)
# How many elements?
print(len(lst[2:5])) # 3 (indices 2,3,4)면접에서의 음수 인덱스
파이썬에는 음수 인덱스가 있습니다. lst[-1]은 마지막 항목이고 lst[-2]는 그 바로 앞 항목입니다. lst[len(lst)-1]보다 lst[-1]을 사용하십시오. 면접관은 더 깔끔한 표현을 알아봅니다.
s = 'abcde'
print(s[-1]) # 'e'
print(s[-3:]) # 'cde'
print(s[:-2]) # 'abc' (all except last 2)
nums = [10, 20, 30, 40]
print(nums[-2]) # 30
nums[-1] = 99
print(nums) # [10, 20, 30, 99]리스트 정렬과 비교
파이썬의 정렬은 팀소트(O(n log n))를 사용하며 안정적입니다. lst.sort()는 리스트 자체를 변경하고, sorted(lst)는 새 리스트를 반환합니다. 사용자 지정 순서에는 키 옵션을 사용하십시오. 코드를 확인해 보십시오.
words = ['banana', 'fig', 'apple', 'kiwi']
words.sort(key=len)
print(words) # ['fig', 'kiwi', 'apple', 'banana']
nums = [3, 1, 4, 1, 5]
print(sorted(nums, reverse=True)) # [5, 4, 3, 1, 1]
print(nums) # unchanged: [3, 1, 4, 1, 5]반복 중 리스트 변경하기
고전적인 함정이 있습니다. 리스트를 순회하는 동안 항목을 추가하거나 삭제하지 마십시오. 항목을 건너뛰거나 프로그램이 중단될 수 있습니다. 대신 컴프리헨션으로 새 리스트를 만드십시오.
# WRONG — skips elements
nums = [1, 2, 3, 4, 5]
for n in nums:
if n % 2 == 0:
nums.remove(n) # skips 4!
print(nums) # [1, 3, 5]... but 4 got skipped? Actually removes 2,4
# CORRECT — build new list
nums = [1, 2, 3, 4, 5]
nums = [n for n in nums if n % 2 != 0]
print(nums) # [1, 3, 5]반복문에서의 튜플 언패킹
튜플 언패킹을 사용하면 반복문이 깔끔해집니다. enumerate는 (index, value)를 제공하고 zip은 두 리스트를 함께 순회합니다. * 나머지 문법은 나머지 항목을 별도의 변수에 담습니다. 코드를 확인해 보십시오.
nums = [10, 20, 30]
for i, v in enumerate(nums):
print(i, v)
# 0 10 / 1 20 / 2 30
a = [1, 2, 3]
b = ['x', 'y', 'z']
for x, y in zip(a, b):
print(x, y)
first, *rest = [1, 2, 3, 4]
print(first, rest) # 1 [2, 3, 4]간단한 확인
간단히 확인해 보겠습니다. 파이썬 리스트, 튜플, 슬라이싱에 대해 무엇을 익혔는지 보여 주십시오. 잘하실 수 있습니다. 💪
레슨 요약
요약하면, 리스트는 append가 O(1)인 동적 배열이고, 슬라이싱은 항상 새로운 복사본을 반환하며, 튜플은 변경할 수 없고 해시 가능합니다. 다음은 딕셔너리와 집합입니다.
자주 묻는 질문
“리스트, 튜플, 슬라이싱” 강의는 무료인가요?
네 — “리스트, 튜플, 슬라이싱” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 DSA Interview Prep 강의 전체를 잠금 해제할 수 있습니다. DSA Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“리스트, 튜플, 슬라이싱”에서 뭘 배우나요?
고전적인 코딩 문제의 실습 예제로 Python 리스트 연산, 슬라이싱 문법, 튜플의 불변성을 익힙니다. 브라우저에서 직접 실행하는 실습 코드로 DSA Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
DSA Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 DSA Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“리스트, 튜플, 슬라이싱” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 DSA Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 DSA Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 리스트, 튜플, 슬라이싱
- Python의 딕셔너리와 집합
- 컴프리헨션과 내장 함수
- 함수, 클로저, 람다