파이썬 리스트(List) 완벽 정리: 추가, 삭제, 슬라이싱, 중복 제거 한 번에
파이썬 리스트(list) 사용법 총정리. 요소 추가(append/insert/extend), 삭제(remove/pop/del), 중복 제거, 슬라이싱, 복사까지 복붙해서 바로 쓰는 예제로 정리했습니다.
파이썬에서 가장 많이 쓰는 자료형은 단연 리스트입니다. 그만큼 검색도 많죠. "파이썬 리스트 추가", "리스트 요소 삭제", "리스트 중복 제거", "리스트 슬라이싱"… 매번 비슷한 걸 찾게 됩니다.
이 글은 파이썬 리스트의 핵심 사용법을 한 곳에 모았습니다. 추가·삭제·탐색·정렬·슬라이싱까지, 전부 복사해서 바로 쓸 수 있게 정리했습니다. 북마크해두고 필요할 때마다 꺼내 쓰세요.
동작 환경: Python 3.x (표준 문법, 별도 설치 불필요)
리스트 생성과 기본
arr = [1, 2, 3] # 기본 생성
arr = [] # 빈 리스트
arr = [0] * 5 # [0, 0, 0, 0, 0]
arr = list(range(5)) # [0, 1, 2, 3, 4]
arr = list("abc") # ['a', 'b', 'c']
len(arr) # 길이
arr[0] # 첫 번째 (인덱스 0)
arr[-1] # 마지막
요소 추가 (append, insert, extend)
세 가지를 헷갈리기 쉬운데, 용도가 다릅니다.
arr = [1, 2, 3]
arr.append(4) # 맨 뒤에 하나 추가 → [1, 2, 3, 4]
arr.insert(1, 10) # 인덱스 1 위치에 삽입 → [1, 10, 2, 3, 4]
arr.extend([5, 6]) # 리스트를 펼쳐서 이어붙임 → [..., 5, 6]
# append vs extend 차이 주의!
a = [1, 2]
a.append([3, 4]) # [1, 2, [3, 4]] ← 리스트 자체가 원소로
b = [1, 2]
b.extend([3, 4]) # [1, 2, 3, 4] ← 원소들이 펼쳐짐
# + 연산자로 합치기 (새 리스트 생성)
merged = [1, 2] + [3, 4] # [1, 2, 3, 4]
요소 삭제 (remove, pop, del, clear)
arr = [1, 2, 3, 2, 4]
arr.remove(2) # 값 2를 찾아 첫 번째만 삭제 → [1, 3, 2, 4]
arr.pop() # 마지막 요소 삭제하고 반환 → 4 반환
arr.pop(0) # 인덱스 0 요소 삭제하고 반환
del arr[1] # 인덱스 1 요소 삭제
del arr[1:3] # 슬라이스 범위 삭제
arr.clear() # 전체 비우기 → []
# 조건에 맞는 요소만 남기기 (필터링)
arr = [1, 2, 3, 4, 5]
arr = [x for x in arr if x % 2 == 0] # 짝수만 → [2, 4]
remove()는 값으로,pop()과del은 인덱스로 삭제한다는 점을 기억하세요.
중복 제거
검색량이 매우 높은 패턴입니다.
arr = [3, 1, 2, 3, 1]
# 순서 상관없을 때
unique = list(set(arr)) # [1, 2, 3] (순서 보장 안 됨)
# 순서 유지하며 중복 제거 (Python 3.7+)
unique = list(dict.fromkeys(arr)) # [3, 1, 2]
탐색 (in, index, count)
arr = [1, 2, 3, 2, 1]
2 in arr # True — 포함 여부
arr.index(2) # 1 — 첫 번째 2의 인덱스
arr.count(2) # 2 — 2의 개수
# 값이 없을 때 index()는 에러 → 미리 확인
if 5 in arr:
print(arr.index(5))
# 조건을 만족하는 첫 인덱스
next((i for i, x in enumerate(arr) if x > 2), -1) # 없으면 -1
슬라이싱 (자르기)
arr = [0, 1, 2, 3, 4, 5]
arr[1:4] # [1, 2, 3] 인덱스 1~3
arr[:3] # [0, 1, 2] 처음부터 3개
arr[3:] # [3, 4, 5] 인덱스 3부터 끝까지
arr[-2:] # [4, 5] 마지막 2개
arr[::2] # [0, 2, 4] 2칸씩 (짝수 인덱스)
arr[::-1] # [5, 4, 3, 2, 1, 0] 뒤집기
arr[:] # 전체 복사 (얕은 복사)
정렬과 뒤집기
arr = [3, 1, 2]
arr.sort() # 제자리 오름차순 정렬 → [1, 2, 3]
arr.sort(reverse=True) # 제자리 내림차순
sorted(arr) # 원본 유지, 새 리스트 반환
arr.reverse() # 순서 뒤집기 (정렬 아님)
정렬 기준 지정, 다중 정렬 등 더 자세한 내용은 [파이썬 정렬 완벽 정리] 글을 참고하세요.
리스트 컴프리헨션 (한 줄로 만들기)
# 제곱 리스트
squares = [x ** 2 for x in range(5)] # [0, 1, 4, 9, 16]
# 조건 필터링
evens = [x for x in range(10) if x % 2 == 0]
# 조건부 값
labels = ["짝" if x % 2 == 0 else "홀" for x in range(5)]
# 2차원 리스트 초기화 (중요!)
grid = [[0] * 3 for _ in range(3)] # 올바른 방법
# grid = [[0] * 3] * 3 ← ❌ 모든 행이 같은 리스트를 참조하는 버그
자주 쓰는 유틸 함수
arr = [3, 1, 4, 1, 5]
sum(arr) # 14 — 합
max(arr) # 5 — 최댓값
min(arr) # 1 — 최솟값
len(arr) # 5 — 길이
# 인덱스와 값 동시에 순회
for i, val in enumerate(arr):
print(i, val)
# 여러 리스트 동시에 순회
for a, b in zip([1, 2], ['x', 'y']):
print(a, b)
# 리스트를 문자열로 합치기
"-".join(["a", "b", "c"]) # 'a-b-c'
"-".join(map(str, [1, 2, 3])) # '1-2-3' (숫자는 str 변환 필요)
리스트 복사 (얕은 복사 vs 깊은 복사)
자주 하는 실수 중 하나입니다. 단순 대입은 복사가 아니라 같은 리스트를 가리킵니다.
a = [1, 2, 3]
b = a # ❌ 복사 아님! 같은 리스트를 가리킴
b.append(4)
print(a) # [1, 2, 3, 4] ← a도 바뀜
# 올바른 복사 방법
b = a.copy() # 또는 a[:], list(a)
# 2차원 리스트는 깊은 복사 필요
import copy
b = copy.deepcopy(a) # 중첩된 리스트까지 완전히 복사
자주 묻는 질문
Q. append와 extend의 차이는?
append는 인자 하나를 통째로 마지막 원소로 추가하고, extend는 인자(반복 가능 객체)의 각 원소를 펼쳐서 이어붙입니다. 리스트를 통째로 넣고 싶으면 append, 합치고 싶으면 extend를 쓰세요.
Q. 리스트에서 특정 값을 모두 삭제하려면?
remove()는 하나만 지우므로, 모두 지우려면 컴프리헨션으로 필터링하세요. arr = [x for x in arr if x != 삭제값]
Q. 리스트와 튜플의 차이는? 리스트는 수정 가능(mutable), 튜플은 수정 불가(immutable)입니다. 변경할 일이 없는 데이터나 딕셔너리 키로 쓸 값은 튜플이 적합합니다.
마무리
파이썬 리스트의 핵심은 추가는 append/insert/extend, 삭제는 remove(값)/pop(인덱스), 잘라내기는 슬라이싱입니다. 그리고 가장 자주 실수하는 두 가지 — b = a는 복사가 아니라는 점과, 2차원 리스트는 [[0]*n for _ in range(m)]로 초기화해야 한다는 점만 기억하면 대부분의 함정을 피할 수 있습니다.
이 패턴들을 손에 익히면 리스트를 다루는 코드가 훨씬 짧고 안전해집니다. 필요할 때마다 이 글을 다시 펼쳐 해당 섹션을 복사해 쓰세요.
리스트와 함께 자주 쓰는 정렬은 [파이썬 정렬 완벽 정리] 글에서 더 깊이 다룹니다.