KR_List - somaz94/python-study GitHub Wiki

Python ๋ฆฌ์ŠคํŠธ(List) ๊ฐœ๋… ์ •๋ฆฌ


1๏ธโƒฃ ๋ฆฌ์ŠคํŠธ(List)๋ž€?

๋ฆฌ์ŠคํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅํ•˜๋Š” ํŒŒ์ด์ฌ์˜ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ด๋‹ค. ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ๋” ์œ ์—ฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

# ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•
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)


2๏ธโƒฃ ๋ฆฌ์ŠคํŠธ ์ธ๋ฑ์‹ฑ๊ณผ ์Šฌ๋ผ์ด์‹ฑ

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๋ถ€ํ„ฐ ์‹œ์ž‘
  • ์Œ์ˆ˜ ์ธ๋ฑ์Šค๋Š” ๋’ค์—์„œ๋ถ€ํ„ฐ ์ ‘๊ทผ
  • ์Šฌ๋ผ์ด์‹ฑ์€ [์‹œ์ž‘:๋:๊ฐ„๊ฒฉ] ํ˜•์‹


3๏ธโƒฃ ๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ

# ๋ฆฌ์ŠคํŠธ ์—ฐ๊ฒฐํ•˜๊ธฐ
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


4๏ธโƒฃ ๋ฆฌ์ŠคํŠธ ์ˆ˜์ •๊ณผ ์‚ญ์ œ

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]


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] (๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)


6๏ธโƒฃ ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜

๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜(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)) ์‚ฌ์šฉ ๊ณ ๋ ค


7๏ธโƒฃ ๋ฆฌ์ŠคํŠธ ๋ณต์‚ฌํ•˜๊ธฐ

ํŒŒ์ด์ฌ์—์„œ ๋ฆฌ์ŠคํŠธ๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ฏ€๋กœ ๋ณต์‚ฌํ•  ๋•Œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

# ์–•์€ ๋ณต์‚ฌ(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()๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ์™„์ „ํ•œ ๋ณต์‚ฌ ๊ฐ€๋Šฅ
  • ์ฐธ์กฐ์™€ ๋ณต์‚ฌ์˜ ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”


8๏ธโƒฃ 2์ฐจ์› ๋ฆฌ์ŠคํŠธ ํ™œ์šฉ

ํŒŒ์ด์ฌ์—์„œ 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 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ์„ ๊ณ ๋ ค


9๏ธโƒฃ ๋ฆฌ์ŠคํŠธ์˜ ์„ฑ๋Šฅ ํŠน์„ฑ

๋ฆฌ์ŠคํŠธ ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ดํ•ดํ•˜๋ฉด ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.

์—ฐ์‚ฐ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์„ค๋ช…
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 ๊ณ ๋ ค
  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ๊ฑฐ์˜ ์—†๋‹ค๋ฉด ๋ถˆ๋ณ€ ์ž๋ฃŒํ˜•์ธ ํŠœํ”Œ ๊ณ ๋ ค


โš ๏ธ **GitHub.com Fallback** โš ๏ธ