본문 바로가기
C.W.K.
Stream
Lesson 02 of 07 · published

리스트를 바꾸는 메서드와 정렬

~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

하나를 넣을지, 여러 개를 펼칠지

append(x)는 x 자체를 원소 하나로 넣고, extend(iterable)은 반복 가능한 값의 원소를 차례로 붙여. 문자열을 extend하면 글자가 하나씩 들어간다는 점이 둘의 차이를 가장 잘 보여줘.

빼고 끼우는 도구

remove는 처음 만난 값을 지우고, pop은 위치의 값을 꺼내 돌려주며, insert는 위치 앞에 넣어. del은 인덱스나 슬라이스 자체를 없애. 왼쪽에서 자주 넣고 빼는 큐라면 모든 원소를 밀어야 하는 리스트보다 collections.deque가 맞아.

sort와 sorted를 구분해

list.sort()는 원본을 제자리에서 정렬하고 None을 반환해. sorted(iterable)은 정렬된 새 리스트를 만들어. 둘 다 key로 비교 기준을 고르고 reverse=True로 내림차순을 만들 수 있어. Python 정렬은 안정적이어서 같은 키의 원래 순서를 보존해.

원칙: 원본의 순서를 바꿔도 되는지가 선택 기준이야. 바꿔도 되면 sort, 보존해야 하면 sorted를 써.

Code

append와 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 — 인덱스로 지움 (값은 반환하지 않음)
del items[1]
print(items)                # ['X', 'b']

# 슬라이스 del — 범위 통째 제거
del items[:]
print(items)                # []
제자리 정렬과 새 리스트 정렬·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"]))
큐에는 리스트보다 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

이름과 나이를 가진 사람 다섯 명을 딕셔너리 리스트로 만들어. 나이 오름차순, 나이 내림차순, 이름 길이순으로 각각 정렬해 보고, 나이 오름차순으로 바꾼 리스트에서 마지막 사람을 pop해 출력해. 반복문 없이 sort, sorted, pop만 써.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

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

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