리스트 기초: Python의 만능 순서형 자료구조

Python list의 생성·접근·슬라이싱·변경 메서드를 정리하고, 정렬(sort/sorted)과 얕은·깊은 복사의 차이까지 다룹니다.

· 4 min read · PALDYN Team

지난 글에서 None을 살펴봤다. 이번에는 Python에서 가장 자주 쓰이는 컨테이너 타입인 **리스트(list)**를 기초부터 살펴본다.

리스트란

리스트는 가변(mutable)·순서 있음·중복 허용 시퀀스다. 이질적인 타입도 담을 수 있으며, 내부적으로는 동적 배열로 구현돼 있다.

lst = [1, 2, 3]
empty = []
mixed = [1, "hi", True, None, [4, 5]]  # 중첩도 가능

인덱싱과 슬라이싱

lst = [10, 20, 30, 40, 50]
lst[0]     # 10  (첫 번째)
lst[-1]    # 50  (마지막)
lst[1:3]   # [20, 30]  (stop 미포함)
lst[::2]   # [10, 30, 50]  (2칸씩)
lst[::-1]  # [50, 40, 30, 20, 10]  (역순)

슬라이스는 새 리스트를 반환한다. lst[::]는 얕은 복사본이다.

리스트 기초 — 생성·접근·수정

주요 메서드

lst = [1, 2, 3]
lst.append(4)        # 끝에 추가: [1, 2, 3, 4]
lst.insert(1, 99)    # 인덱스 1에 삽입: [1, 99, 2, 3, 4]
lst.extend([5, 6])   # 여러 원소 추가
lst.remove(99)       # 값으로 첫 번째 항목 삭제
lst.pop()            # 마지막 항목 삭제 후 반환
lst.pop(0)           # 인덱스 0 삭제 후 반환
del lst[2]           # 인덱스 2 삭제 (반환값 없음)
lst.clear()          # 모두 삭제

검색과 유용한 함수

lst = [3, 1, 4, 1, 5, 9, 2, 6]
3 in lst          # True
lst.index(4)      # 2  (첫 위치)
lst.count(1)      # 2  (개수)
len(lst)          # 8
sum(lst)          # 31
min(lst), max(lst) # 1, 9

정렬

nums = [3, 1, 4, 1, 5]
nums.sort()               # in-place, None 반환
nums.sort(reverse=True)   # 내림차순

s = sorted(nums)          # 새 리스트 반환, 원본 불변
sorted(nums, key=abs)     # key 함수 지정

words = ["banana", "fig", "apple"]
sorted(words, key=len)    # 길이 기준: ['fig', 'apple', 'banana']
sorted(words, key=lambda w: (len(w), w))  # 길이→알파벳 다중 조건

sort()는 원본을 수정하며 None을 반환한다. sorted()는 새 리스트를 반환한다.

리스트 정렬·복사

얕은 복사 vs 깊은 복사

a = [1, 2, [3, 4]]
b = a[:]            # 얕은 복사 (a.copy(), list(a)도 동일)

b[0] = 99           # a[0]은 그대로 1
b[2].append(5)      # a[2]도 [3, 4, 5]로 변경됨!

import copy
c = copy.deepcopy(a)
c[2].append(9)      # a 영향 없음

중첩 리스트가 있으면 얕은 복사는 내부 객체를 공유한다. 독립적인 복사가 필요하면 deepcopy를 써야 한다.

리스트 연산

[1, 2] + [3, 4]  # [1, 2, 3, 4]  (새 리스트)
[0] * 3          # [0, 0, 0]

a = [1, 2]
a += [3, 4]      # extend와 동일: [1, 2, 3, 4] (in-place)

+는 새 리스트를 반환하지만 +=는 in-place 확장이다.

리스트 언패킹

first, *rest = [1, 2, 3, 4, 5]
# first = 1, rest = [2, 3, 4, 5]

a, b, c = [10, 20, 30]
a, b = b, a      # swap

지난 글: None: Python의 ‘없음’을 나타내는 단 하나의 값

다음 글: 튜플: 불변 시퀀스의 힘과 언패킹 패턴


읽어주셔서 감사합니다. 😊