리스트에 요소를 추가하는 메서드는 세 가지가 있습니다. 각각의 특성이 다르기 때문에 상황에 맞게 사용하는 것이 중요합니다.
| 메서드 | 기능 | 특징 |
|---|---|---|
append(요소) | 요소 하나를 리스트 끝에 추가 | 리스트를 넣으면 중첩 리스트가 됨 |
extend(리스트) | 리스트를 연결하여 확장 | 원본 리스트가 변경되며, 새 리스트는 생성되지 않음 |
insert(인덱스, 요소) | 특정 인덱스에 요소 추가 | 원하는 위치에 삽입 가능 |
append는 리스트 끝에 요소 하나를 추가합니다. 주의할 점은, 리스트를 인자로 넣으면 리스트 자체가 하나의 요소로 들어간다는 것입니다.
# append로 요소 하나 추가
a = [1, 2, 3]
a.append(4)
print(a) # [1, 2, 3, 4]
# 리스트를 append하면 중첩 리스트가 된다
a.append([5, 6])
print(a) # [1, 2, 3, 4, [5, 6]]
요소 여러 개를 각각 추가하려면 append를 여러 번 호출해야 하므로 번거롭습니다.
여러 요소를 한 번에 추가하고 싶다면 extend를 사용합니다. 메서드를 호출한 리스트 자체가 변경되며, 새로운 리스트는 생성되지 않습니다.
# extend로 여러 요소 한 번에 추가
a = [1, 2, 3]
a.extend([4, 5, 6])
print(a) # [1, 2, 3, 4, 5, 6]
insert는 지정한 인덱스에 요소를 추가합니다.
# insert로 특정 위치에 요소 추가
a = [1, 2, 3]
a.insert(1, 100)
print(a) # [1, 100, 2, 3]
만약 리스트 중간에 요소 여러 개를 추가하고 싶다면, 슬라이스에 요소를 할당하는 방법을 활용할 수 있습니다.
# 슬라이스를 활용한 중간 삽입
a = [1, 2, 3, 4, 5]
a[2:2] = [10, 20, 30]
print(a) # [1, 2, 10, 20, 30, 3, 4, 5]
요소 삭제와 관련된 메서드와 키워드를 정리하면 다음과 같습니다.
| 방법 | 기능 | 반환값 |
|---|---|---|
pop() | 마지막 요소 삭제 | 삭제된 요소 반환 |
pop(인덱스) | 해당 인덱스의 요소 삭제 | 삭제된 요소 반환 |
del 리스트[인덱스] | 해당 인덱스의 요소 삭제 | 반환값 없음 |
remove(값) | 특정 값을 찾아 삭제 | 반환값 없음, 처음 찾은 값만 삭제 |
a = [10, 20, 30, 20, 40]
# pop: 마지막 요소 삭제 후 반환
last = a.pop()
print(last) # 40
print(a) # [10, 20, 30, 20]
# pop(인덱스): 특정 인덱스 요소 삭제 후 반환
second = a.pop(1)
print(second) # 20
print(a) # [10, 30, 20]
# remove: 값으로 삭제 (같은 값이 여러 개면 처음 찾은 것만 삭제)
a = [10, 20, 30, 20]
a.remove(20)
print(a) # [10, 30, 20]
💡
pop은 삭제한 요소를 반환하므로, 삭제와 동시에 값을 활용해야 할 때 유용합니다. 단순 삭제만 필요하다면del을 사용해도 좋습니다.
a = [10, 20, 30, 20, 40]
# index: 특정 값의 인덱스를 구함 (처음 찾은 것)
print(a.index(20)) # 1
# count: 특정 값의 개수를 구함
print(a.count(20)) # 2
reverse는 리스트의 요소 순서를 반대로 뒤집습니다. 정렬이 아닌 단순 역순이라는 점에 주의하세요.
a = [3, 1, 2]
a.reverse()
print(a) # [2, 1, 3]
이 둘은 모두 정렬을 수행하지만, 원본 변경 여부에서 차이가 있습니다.
| 구분 | sort() | sorted() |
|---|---|---|
| 종류 | 리스트 메서드 | 내장 함수 |
| 원본 변경 | ✅ 원본 리스트를 변경 | ❌ 새 리스트를 생성 |
| 반환값 | None | 정렬된 새 리스트 |
# sort: 원본 리스트를 오름차순으로 변경
a = [3, 1, 4, 1, 5]
a.sort()
print(a) # [1, 1, 3, 4, 5]
# sorted: 원본은 유지하고 새 리스트를 반환
b = [3, 1, 4, 1, 5]
new_b = sorted(b)
print(b) # [3, 1, 4, 1, 5] (원본 유지)
print(new_b) # [1, 1, 3, 4, 5]
⚠️
sort()의 반환값은None이므로,a = a.sort()처럼 쓰면a가None이 됩니다. 흔히 하는 실수이니 주의하세요!
a = [1, 2, 3]
a.clear()
print(a) # []
# del을 활용한 방법도 동일한 결과
b = [1, 2, 3]
del b[:]
print(b) # []
이 부분은 파이썬 입문자가 자주 혼동하는 핵심 개념입니다.
할당은 같은 리스트를 두 변수가 가리키는 것이고, 복사는 완전히 독립된 리스트를 만드는 것입니다.
# 할당: 같은 리스트를 공유 (실제로 리스트는 하나)
a = [1, 2, 3]
b = a
b[0] = 999
print(a) # [999, 2, 3] ← a도 같이 변경됨!
# 복사: 독립된 리스트를 생성
a = [1, 2, 3]
b = a.copy()
b[0] = 999
print(a) # [1, 2, 3] ← a는 변경되지 않음
💡
copy()는 얕은 복사(shallow copy)입니다. 리스트 안에 리스트가 있는 중첩 구조에서는copy모듈의deepcopy()를 사용해야 완전한 복사가 됩니다.
# 기본 순회
a = ['apple', 'banana', 'cherry']
for item in a:
print(item)
# enumerate: 인덱스와 값을 함께 출력
for i, item in enumerate(a):
print(f"{i}: {item}")
# 0: apple
# 1: banana
# 2: cherry
a = [10, 20, 30]
print(min(a)) # 10
print(max(a)) # 30
print(sum(a)) # 60
리스트 안에 식, for 반복문, if 조건문을 사용하여 리스트를 생성하는 것을 리스트 컴프리헨션이라고 합니다. 파이썬다운(Pythonic) 코드를 작성할 때 필수적으로 알아야 하는 문법입니다.
# 기본 형태: [식 for 변수 in 반복가능객체]
squares = [x ** 2 for x in range(5)]
print(squares) # [0, 1, 4, 9, 16]
if 조건문을 추가하여 필터링할 수도 있습니다.
# if 조건 추가: [식 for 변수 in 반복가능객체 if 조건]
evens = [x for x in range(10) if x % 2 == 0]
print(evens) # [0, 2, 4, 6, 8]
for와 if를 여러 번 사용하는 것도 가능합니다.
# 중첩 for문을 활용한 리스트 컴프리헨션
pairs = [(x, y) for x in range(3) for y in range(3) if x != y]
print(pairs) # [(0, 1), (0, 2), (1, 0), (1, 2), (2, 0), (2, 1)]
map은 리스트의 요소를 지정된 함수로 처리해주는 함수입니다. 반환값은 맵 객체(이터레이터)이므로, list()로 감싸거나 언패킹하여 사용합니다.
# map으로 모든 요소에 함수 적용
a = [1, 2, 3, 4]
result = list(map(lambda x: x ** 2, a))
print(result) # [1, 4, 9, 16]
# 언패킹 활용
a, b, c = map(int, ['10', '20', '30'])
print(a, b, c) # 10 20 30
튜플(tuple)은 리스트와 달리 한 번 만들면 내용을 변경할 수 없습니다. 따라서 요소를 조회하는 메서드만 사용할 수 있습니다.
| 메서드 | 기능 |
|---|---|
index(값) | 특정 값의 인덱스를 구함 |
count(값) | 특정 값의 개수를 구함 |
t = (10, 20, 30, 20)
print(t.index(20)) # 1
print(t.count(20)) # 2
튜플에도 map, min, max, sum을 사용할 수 있습니다.
t = (10, 20, 30)
print(min(t)) # 10
print(max(t)) # 30
print(sum(t)) # 60
⚠️ 주의: 괄호 안에 표현식을 넣으면 튜플이 아니라 제너레이터 표현식이 됩니다.
# 이것은 튜플이 아니라 제너레이터!
g = (x ** 2 for x in range(5))
print(type(g)) # <class 'generator'>
# 튜플 컴프리헨션을 원한다면 tuple()로 감싸야 합니다
t = tuple(x ** 2 for x in range(5))
print(t) # (0, 1, 4, 9, 16)