KR_List - somaz94/python-study GitHub Wiki
๋ฆฌ์คํธ๋ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์์๋๋ก ์ ์ฅํ๋ ํ์ด์ฌ์ ๊ธฐ๋ณธ ์๋ฃํ์ด๋ค. ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฐฐ์ด๊ณผ ๋น์ทํ์ง๋ง, ๋ ์ ์ฐํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
# ๋ฆฌ์คํธ ์์ฑ ๋ฐฉ๋ฒ
numbers = [] # ๋น ๋ฆฌ์คํธ
odds = [1, 3, 5, 7, 9] # ํ์ ๋ฆฌ์คํธ
evens = list(range(0, 10, 2)) # ์ง์ ๋ฆฌ์คํธ
mixed = [1, "hello", 3.14, True] # ๋ค์ํ ์๋ฃํ
matrix = [[1, 2], [3, 4]] # ์ค์ฒฉ ๋ฆฌ์คํธ
โ Tip:
-
[]
๋๋list()
๋ก ์์ฑ ๊ฐ๋ฅ - ์ด๋ค ์๋ฃํ์ด๋ ์ ์ฅ ๊ฐ๋ฅ
- ์์๊ฐ ์๊ณ ๋ณ๊ฒฝ ๊ฐ๋ฅ(mutable)
numbers = [1, 2, 3, 4, 5]
# ์ธ๋ฑ์ฑ
print(numbers[0]) # 1 (์ฒซ ๋ฒ์งธ ์์)
print(numbers[-1]) # 5 (๋ง์ง๋ง ์์)
# ์ฌ๋ผ์ด์ฑ
print(numbers[1:3]) # [2, 3]
print(numbers[:3]) # [1, 2, 3]
print(numbers[3:]) # [4, 5]
print(numbers[:]) # [1, 2, 3, 4, 5]
# ์ค์ฒฉ ๋ฆฌ์คํธ ์ธ๋ฑ์ฑ
nested = [1, [2, 3, ['hello']]]
print(nested[1][2][0]) # 'hello'
โ Tip:
- ์ธ๋ฑ์ค๋ 0๋ถํฐ ์์
- ์์ ์ธ๋ฑ์ค๋ ๋ค์์๋ถํฐ ์ ๊ทผ
- ์ฌ๋ผ์ด์ฑ์ [์์:๋:๊ฐ๊ฒฉ] ํ์
# ๋ฆฌ์คํธ ์ฐ๊ฒฐํ๊ธฐ
a = [1, 2, 3]
b = [4, 5, 6]
print(a + b) # [1, 2, 3, 4, 5, 6]
# ๋ฆฌ์คํธ ๋ฐ๋ณตํ๊ธฐ
print(a * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
# ๋ฆฌ์คํธ ๊ธธ์ด
print(len(a)) # 3
numbers = [1, 2, 3, 4, 5]
# ๊ฐ ์์
numbers[2] = 30
print(numbers) # [1, 2, 30, 4, 5]
# ์์ ์ญ์
del numbers[2] # ์ธ๋ฑ์ค๋ก ์ญ์
print(numbers) # [1, 2, 4, 5]
# ์ฌ๋ผ์ด์ค๋ก ์ญ์
del numbers[1:3] # 1๋ฒ๋ถํฐ 3๋ฒ ์ ๊น์ง ์ญ์
print(numbers) # [1, 5]
numbers = [1, 2, 3]
# ์์ ์ถ๊ฐ
numbers.append(4) # ๋์ ์ถ๊ฐ
numbers.insert(1, 1.5) # ์ง์ ์์น์ ์ถ๊ฐ
numbers.extend([5, 6, 7]) # ๋ฆฌ์คํธ ํ์ฅ
# ์์ ์ ๊ฑฐ
numbers.remove(1.5) # ๊ฐ์ผ๋ก ์ ๊ฑฐ
popped = numbers.pop() # ๋ง์ง๋ง ์์ ์ ๊ฑฐ ํ ๋ฐํ
popped = numbers.pop(1) # ์ง์ ์์น ์์ ์ ๊ฑฐ ํ ๋ฐํ
# ์ ๋ ฌ
numbers.sort() # ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
numbers.sort(reverse=True) # ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
numbers.reverse() # ๋ฆฌ์คํธ ๋ค์ง๊ธฐ
# ๊ธฐํ ์ฐ์ฐ
index = numbers.index(3) # ์์์ ์ธ๋ฑ์ค ์ฐพ๊ธฐ
count = numbers.count(2) # ์์์ ๊ฐ์ ์ธ๊ธฐ
numbers.clear() # ๋ชจ๋ ์์ ์ ๊ฑฐ
โ ์ฃผ์ ๋ฉ์๋ ์ ๋ฆฌ:
-
append()
: ๋์ ์์ ์ถ๊ฐ -
insert()
: ์ง์ ์์น์ ์์ ์ถ๊ฐ -
extend()
: ๋ฆฌ์คํธ ํ์ฅ -
remove()
: ๊ฐ์ผ๋ก ์์ ์ ๊ฑฐ -
pop()
: ์์ ์ ๊ฑฐ ํ ๋ฐํ -
sort()
: ์ ๋ ฌ -
reverse()
: ์์ ๋ค์ง๊ธฐ -
index()
: ์์น ์ฐพ๊ธฐ -
count()
: ๊ฐ์ ์ธ๊ธฐ
โ Tip:
- ๋ฆฌ์คํธ ๋ฉ์๋๋ ๋๋ถ๋ถ ์๋ณธ์ ์ง์ ์์ ํจ
-
sort()
์sorted()
์ ์ฐจ์ด์ ์ฃผ์ -
remove()
๋ ์ฒซ ๋ฒ์งธ ์ผ์นํ๋ ์์๋ง ์ ๊ฑฐ
์ฐธ๊ณ
์ธ์ด | ๊ณ ์ ๋ ํฌ๊ธฐ (๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ) | ํฌ๊ธฐ ๊ฐ๋ณ (๋ณ๊ฒฝ ๊ฐ๋ฅ) |
---|---|---|
Go | Array [3]int (๊ณ ์ ํฌ๊ธฐ) |
Slice []int (๊ฐ๋ณ ํฌ๊ธฐ) |
Python | Tuple (1,2,3) (๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ) |
List [1,2,3] (๋ณ๊ฒฝ ๊ฐ๋ฅ) |
๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ (List Comprehension)์ ๊ธฐ์กด ๋ฆฌ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ฅผ ๋ง๋๋ ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ด๋ค.
# ๊ธฐ๋ณธ ํ์
squares = [x**2 for x in range(10)] # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# ์กฐ๊ฑด์ ์ถ๊ฐ
even_squares = [x**2 for x in range(10) if x % 2 == 0] # [0, 4, 16, 36, 64]
# ๋ค์ค for๋ฌธ
coordinates = [(x, y) for x in range(3) for y in range(2)]
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1)]
# ์ค์ฒฉ ๋ฆฌ์คํธ ํํํ
matrix = [[1, 2], [3, 4]]
flattened = [num for row in matrix for num in row] # [1, 2, 3, 4]
# if-else ์ฌ์ฉ
values = [x if x % 2 == 0 else 'odd' for x in range(5)] # [0, 'odd', 2, 'odd', 4]
โ Tip:
- ๊ฐ๋ ์ฑ ์๋ ์ฝ๋๋ฅผ ์ํด ๋ณต์กํ ์ปดํ๋ฆฌํจ์ ์ ํผํ๋ ๊ฒ์ด ์ข๋ค
- ์ฌ๋ฌ ํํ์์ด ์ค์ฒฉ๋๋ฉด ์ผ๋ฐ for ๋ฃจํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ๋ช ํํ ์ ์๋ค
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ๊ณ ๋ คํ๋ค๋ฉด ์ ๋๋ ์ดํฐ ํํ์
(x for x in range(10))
์ฌ์ฉ ๊ณ ๋ ค
ํ์ด์ฌ์์ ๋ฆฌ์คํธ๋ ์ฐธ์กฐ ํ์ ์ด๋ฏ๋ก ๋ณต์ฌํ ๋ ์ฃผ์๊ฐ ํ์ํ๋ค.
# ์์ ๋ณต์ฌ(Shallow Copy) - 1์ฐจ์ ๋ฆฌ์คํธ์ ํจ๊ณผ์
original = [1, 2, 3]
# ๋ฐฉ๋ฒ 1: ์ฌ๋ผ์ด์ฑ
copy1 = original[:]
# ๋ฐฉ๋ฒ 2: list() ํจ์
copy2 = list(original)
# ๋ฐฉ๋ฒ 3: copy ๋ฉ์๋
copy3 = original.copy()
# ์ฐธ์กฐ ๋ณต์ฌ(์ค์ ๋ก๋ ๊ฐ์ ๊ฐ์ฒด ์ฐธ์กฐ)
reference = original
# ์ฐธ์กฐ ๋ณต์ฌ์ ๋ฌธ์ ์
reference[0] = 100
print(original) # [100, 2, 3] - ์๋ณธ๋ ๋ณ๊ฒฝ๋จ
# ์์ ๋ณต์ฌ์ ํ๊ณ (์ค์ฒฉ ๋ฆฌ์คํธ)
nested = [[1, 2], [3, 4]]
shallow_copy = nested.copy()
shallow_copy[0][0] = 99
print(nested) # [[99, 2], [3, 4]] - ๋ด๋ถ ๋ฆฌ์คํธ๋ ์ฌ์ ํ ์ฐธ์กฐ ๊ณต์
# ๊น์ ๋ณต์ฌ(Deep Copy)
import copy
deep_copy = copy.deepcopy(nested)
deep_copy[0][0] = 999
print(nested) # [[99, 2], [3, 4]] - ์๋ณธ ์ ์ง
โ Tip:
- 1์ฐจ์ ๋ฆฌ์คํธ๋ ์ฌ๋ผ์ด์ฑ์ด๋
copy()
๋ฉ์๋๋ก ๋ณต์ฌ ๊ฐ๋ฅ - ์ค์ฒฉ ๋ฆฌ์คํธ๋
copy.deepcopy()
๋ฅผ ์ฌ์ฉํด์ผ ์์ ํ ๋ณต์ฌ ๊ฐ๋ฅ - ์ฐธ์กฐ์ ๋ณต์ฌ์ ์ฐจ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ ๋งค์ฐ ์ค์
ํ์ด์ฌ์์ 2์ฐจ์ ๋ฆฌ์คํธ๋ ํ๋ ฌ์ด๋ ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ํํํ ๋ ์ ์ฉํ๋ค.
# 2์ฐจ์ ๋ฆฌ์คํธ ์์ฑ
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
# ์ ๊ทผํ๊ธฐ
print(matrix[1][2]) # 6 (2ํ 3์ด)
# ํ๊ณผ ์ด ํฌ๊ธฐ ๊ตฌํ๊ธฐ
rows = len(matrix)
cols = len(matrix[0])
print(f"{rows}x{cols} ํ๋ ฌ") # 3x3 ํ๋ ฌ
# ํ๋ ฌ ์ํํ๊ธฐ
for row in matrix:
for element in row:
print(element, end=' ')
print()
# ํ๋ ฌ ๋ณํ (์ ์น ํ๋ ฌ)
transposed = [[matrix[j][i] for j in range(rows)] for i in range(cols)]
print(transposed) # [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
# ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์
์ผ๋ก 2์ฐจ์ ๋ฆฌ์คํธ ์์ฑ
# n x m ์ํ๋ ฌ
n, m = 3, 4
zeros = [[0 for _ in range(m)] for _ in range(n)]
print(zeros) # [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
# ์ด๊ธฐํ ์ฃผ์์ฌํญ
# ์๋ชป๋ ๋ฐฉ๋ฒ (๋ชจ๋ ํ์ด ๊ฐ์
wrong_matrix = [[0] * 3] * 3
wrong_matrix[0][0] = 1
print(wrong_matrix) # [[1, 0, 0], [1, 0, 0], [1, 0, 0]] - ๋ชจ๋ ํ์ด ์ํฅ ๋ฐ์
# ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ
correct_matrix = [[0] * 3 for _ in range(3)]
correct_matrix[0][0] = 1
print(correct_matrix) # [[1, 0, 0], [0, 0, 0], [0, 0, 0]]
โ Tip:
- 2์ฐจ์ ๋ฆฌ์คํธ ์์ฑ ์ ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์ ์ฌ์ฉ์ ๊ถ์ฅ
-
[[0] * n] * m
๊ณผ ๊ฐ์ ๋ฐฉ์์ ๋ด๋ถ ๋ฆฌ์คํธ๊ฐ ์ฐธ์กฐ ๊ณต์ ๋๋ฏ๋ก ์ฃผ์ - ํ๋ ฌ ์ฐ์ฐ์ด ๋ง๋ค๋ฉด
numpy
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ๊ณ ๋ ค
๋ฆฌ์คํธ ์ฐ์ฐ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ์ดํดํ๋ฉด ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ๋๋ค.
์ฐ์ฐ | ์๊ฐ ๋ณต์ก๋ | ์ค๋ช |
---|---|---|
len(list) |
O(1) | ๋ฆฌ์คํธ ๊ธธ์ด ์กฐํ๋ ์์ ์๊ฐ |
list[i] |
O(1) | ์ธ๋ฑ์ค๋ก ์ ๊ทผ์ ์์ ์๊ฐ |
list.append(x) |
O(1) | ๋์ ์ถ๊ฐ๋ ์์ ์๊ฐ (ํ๊ท ) |
list.insert(i, x) |
O(n) | ์ฝ์ ์์น ์ดํ ์์ ์ด๋ ํ์ |
list.pop() |
O(1) | ๋ง์ง๋ง ์์ ์ ๊ฑฐ๋ ์์ ์๊ฐ |
list.pop(i) |
O(n) | ์ค๊ฐ ์์ ์ ๊ฑฐ ์ ์ดํ ์์ ์ด๋ |
x in list |
O(n) | ์์ ์กด์ฌ ์ฌ๋ถ ํ์ธ์ ์ ํ ์๊ฐ |
list.count(x) |
O(n) | ํน์ ๊ฐ ๊ฐ์ ์ธ๊ธฐ๋ ์ ํ ์๊ฐ |
list.extend(iterable) |
O(k) | k๋ ์ถ๊ฐํ iterable์ ๊ธธ์ด |
list.sort() |
O(n log n) | ์ ๋ ฌ์ ๋น๊ต ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ ์ฌ์ฉ |
# ์ฑ๋ฅ ๊ด๋ จ ์์
import timeit
import random
# ํฐ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
big_list = list(range(10000))
random.shuffle(big_list)
# ๋ฆฌ์คํธ ์์ ์ฝ์
vs ๋ค์ ์ฝ์
append_time = timeit.timeit(
lambda: big_list.append(999),
number=1000
)
insert_time = timeit.timeit(
lambda: big_list.insert(0, 999),
number=1000
)
print(f"append: {append_time:.6f}์ด, insert(0): {insert_time:.6f}์ด")
# append๊ฐ ํจ์ฌ ๋น ๋ฆ
# in ์ฐ์ฐ์์ set์ ์ฑ๋ฅ ๋น๊ต
def check_list(val):
return val in big_list
def check_set(val):
return val in set(big_list)
list_time = timeit.timeit(
lambda: check_list(9999),
number=1000
)
set_time = timeit.timeit(
lambda: check_set(9999),
number=1000
)
print(f"list ๊ฒ์: {list_time:.6f}์ด, set ๊ฒ์: {set_time:.6f}์ด")
# set์ด ํจ์ฌ ๋น ๋ฆ
โ ์ฑ๋ฅ ์ต์ ํ Tip:
- ์์ ๊ฒ์์ด ๋น๋ฒํ๋ฉด ๋ฆฌ์คํธ ๋์ set์ด๋ dictionary ์ฌ์ฉ ๊ณ ๋ ค
- ์์ชฝ ์ฝ์
/์ญ์ ๊ฐ ๋ง๋ค๋ฉด
collections.deque
์ฌ์ฉ - ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋๋ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ array ๋ชจ๋์ด๋ numpy ๊ณ ๋ ค
- ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ด ๊ฑฐ์ ์๋ค๋ฉด ๋ถ๋ณ ์๋ฃํ์ธ ํํ ๊ณ ๋ ค