List 메서드 & mutation 패턴 — append vs extend, sort vs sorted
~22 min · list, mutation, append, extend, sort
Level 0호기심
0 XP0/93 lessons0/23 achievements
0/100 XP to next level100 XP to go0% complete
두 갈래의 추가 — 헷갈리지 마
가장 자주 쓰는 list 메서드 두 개가 append 랑 extend. 비슷해 보여서 초보들이 섞어 쓰다가 사고 쳐. append(x) 는 한 원소 를 끝에 붙여. extend(iterable) 는 iterable 의 각 원소 를 하나씩 붙여. extend 에 문자열 넘기면? 글자가 다 풀려 들어가. 거의 절대 원하는 게 아니야.
insert / remove / pop — 외과 수술 도구
insert(i, x) — 위치 i 에 x 끼워넣고 뒤를 밀어. remove(x) — 값 x 의 첫 번째 등장 을 제거. 없으면 ValueError. pop(i) — 인덱스 i 의 원소를 지우고 반환. 디폴트는 마지막. pop 이 반환한다는 점이 list 를 스택으로 쓰게 해줘.
sort / sorted — in-place 와 반환의 차이
Python 의 정렬은 두 갈래야. 두 개가 *같은 거* 라고 생각하면 사고. my_list.sort() — 그 자리에서 정렬, None 반환. sorted(iterable) — 새 정렬된 list 를 반환, 입력은 그대로. 후자는 list 가 아니어도 어떤 iterable 이든 받아.
원칙: in-place 로 바꾸는 메서드는 None 을 반환해. my_list.sort(), my_list.reverse(), my_list.append(x) 모두. 가장 흔한 버그 — x = my_list.sort() 하고 x 가 왜 None 인지 한참 들여다보는 것. 정렬된 사본이 필요하면 sorted(my_list).
key 인자 — 값 자체가 아닌 다른 기준으로 정렬
sort 와 sorted 둘 다 key 라는 함수를 받아. 정렬 순서는 원소 자체가 아니라 key(원소) 의 결과로 결정돼. key=str.lower 면 대소문자 구분 없는 문자열 정렬. key=len 이면 길이순. key=lambda x: x["age"] 면 dict 의 age 필드로. 이 패턴은 Python 어디든 나와.
list 는 좋은 스택, 나쁜 큐
스택으로는 list 가 완벽 — append 로 push, pop 으로 pop. 양쪽 다 O(1). 근데 큐로 쓰면 — pop(0) 이 O(n) 이야. 모든 원소가 한 칸씩 왼쪽으로 밀려. 큐가 필요하면 collections.deque. (stdlib 트랙에서 다룰 거야.)
Pythonic Way: for 문 돌려서 append 호출하고 있다? 컴프리헨션이 답일 가능성 90%. [x*2 for x in source] 가 5 줄짜리 for 보다 이김. lesson 6 에서.
Code
append vs extend — 초보들이 가장 자주 트는 함정·python
letters = ['a', 'b']
# append: 원소 한 개 추가 (그게 list 라도)
letters.append(['c', 'd'])
print(letters) # ['a', 'b', ['c', 'd']]
letters = ['a', 'b']
# extend: iterable 의 각 원소 추가
letters.extend(['c', 'd'])
print(letters) # ['a', 'b', 'c', 'd']
# 조심 — 문자열도 iterable
letters = ['a', 'b']
letters.extend("cd")
print(letters) # ['a', 'b', 'c', 'd'] — 글자가 풀림!
# 같은 표현: my_list += other_iterable
letters = ['a', 'b']
letters += ['c', 'd']
print(letters) # ['a', 'b', 'c', 'd']
remove / pop / insert / del — 수술 도구 모음·python
items = ['a', 'b', 'c', 'b', 'd']
# 첫 등장 한 개 제거
items.remove('b')
print(items) # ['a', 'c', 'b', 'd']
# pop — 반환 + 제거. 스택의 핵심.
last = items.pop()
print(last, items) # 'd' ['a', 'c', 'b']
first = items.pop(0)
print(first, items) # 'a' ['c', 'b']
# 특정 인덱스에 끼워넣기
items.insert(0, 'X')
print(items) # ['X', 'c', 'b']
# del — 인덱스로 지움 (반환 X)
del items[1]
print(items) # ['X', 'b']
# 슬라이스 del — 범위 통째 제거
del items[:]
print(items) # []
사람 5 명을 dict 의 list 로 만들어 — 각각 name (str), age (int) 필드. (a) age 오름차순으로 정렬. (b) age 내림차순. (c) name 길이순. (d) (a) 한 후에 마지막 (가장 늙은) 사람 pop 해서 그 사람만 출력. .sort / sorted / pop 만 써 — for 문 X.
Progress
Progress is local-only — sign in to sync across devices.