C.W.K.
Stream
Lesson 02 of 07 · published

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 메서드 두 개가 appendextend. 비슷해 보여서 초보들이 섞어 쓰다가 사고 쳐. append(x)한 원소 를 끝에 붙여. extend(iterable)iterable 의 각 원소 를 하나씩 붙여. extend 에 문자열 넘기면? 글자가 다 풀려 들어가. 거의 절대 원하는 게 아니야.

insert / remove / pop — 외과 수술 도구

insert(i, x) — 위치 ix 끼워넣고 뒤를 밀어. 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 인자 — 값 자체가 아닌 다른 기준으로 정렬

sortsorted 둘 다 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)                # []
sort vs sorted — None 의 함정·python
nums = [3, 1, 4, 1, 5, 9, 2, 6]

# sort — 그 자리에서, None 반환
result = nums.sort()
print(result)               # None    <- 흔한 버그
print(nums)                 # [1, 1, 2, 3, 4, 5, 6, 9]

# sorted — 새 list 반환, 원본 그대로
nums = [3, 1, 4, 1, 5]
new = sorted(nums)
print(new)                  # [1, 1, 3, 4, 5]
print(nums)                 # [3, 1, 4, 1, 5]   바뀌지 않음

# 역순 정렬
print(sorted(nums, reverse=True))   # [5, 4, 3, 1, 1]
key 인자 — 다른 기준으로 정렬·python
words = ["banana", "Apple", "cherry", "date"]

# 디폴트는 대소문자 구분 — 'A' < 'b'
print(sorted(words))                  # ['Apple', 'banana', 'cherry', 'date']

# key=str.lower 로 소문자 변환 후 비교
print(sorted(words, key=str.lower))   # ['Apple', 'banana', 'cherry', 'date']

# 길이 순
print(sorted(words, key=len))         # ['date', 'Apple', 'banana', 'cherry']

# dict 를 특정 필드로 정렬
people = [{"name": "A", "age": 30},
          {"name": "B", "age": 25},
          {"name": "C", "age": 35}]
print(sorted(people, key=lambda p: p["age"]))
list 가 큐로는 나쁘다는 증거 (그리고 deque 가 답)·python
# 스택으로는 빠름 — 양쪽 끝 O(1)
stack = []
stack.append(1)        # push    O(1)
stack.append(2)
stack.pop()            # pop     O(1)

# 왼쪽에서 빼는 큐는 느림 — O(n)
queue = [1, 2, 3, 4]
queue.pop(0)           # O(n) — 모든 원소가 한 칸 밀림

# collections.deque — 양쪽 다 O(1)
from collections import deque
q = deque([1, 2, 3, 4])
q.popleft()            # O(1)
q.appendleft(0)        # O(1)
print(q)               # deque([0, 2, 3, 4])

External links

Exercise

사람 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.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.