๐ŸํŒŒ์ด์ฌ ์ดˆ๋ณด์ž ๊ฐ€์ด๋“œ : ๋ฆฌ์ŠคํŠธ(List) ์˜ˆ์ œ



ํŒŒ์ด์ฌ์˜ **๋ฆฌ์ŠคํŠธ(list)**๋Š” ์ดˆ๋ณด์ž์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ž๋ฃŒํ˜• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 

์•„๋ž˜์— ์‰ฝ๊ฒŒ, ์˜ˆ์ œ๋กœ ํ’๋ถ€ํ•˜๊ฒŒ, ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๊ฐ ์˜ˆ์ œ๋Š” ๋ฐ”๋กœ ๋ณต์‚ฌํ•ด์„œ ์‹คํ–‰ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


1) ๋ฆฌ์ŠคํŠธ๋ž€?

  • ์—ฌ๋Ÿฌ ๊ฐ’์„ ์ˆœ์„œ ์žˆ๊ฒŒ ๋‹ด๋Š” ๊ทธ๋ฆ‡(์ปฌ๋ ‰์…˜)์ž…๋‹ˆ๋‹ค.
  • ๋Œ€๊ด„ํ˜ธ []๋กœ ๋งŒ๋“ค๊ณ , ๊ฐ’๋“ค์€ ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ’์˜ ์ข…๋ฅ˜(์ˆซ์ž, ๋ฌธ์ž, ๋‹ค๋ฅธ ๋ฆฌ์ŠคํŠธ ๋“ฑ)๋ฅผ ํ˜ผํ•ฉํ•ด์„œ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
# ๋ฆฌ์ŠคํŠธ ์˜ˆ์‹œ
nums = [10, 20, 30]
fruits = ["apple", "banana", "cherry"]
mixed = [1, "two", 3.0, True]
nested = [1, [2, 3], ["a", "b"]]


2) ๋งŒ๋“ค๊ธฐ & ๊ธธ์ด ํ™•์ธ

empty = []             # ๋นˆ ๋ฆฌ์ŠคํŠธ
data = list("abc")     # ['a', 'b', 'c'] ๋ฌธ์ž์—ด์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜
length = len([1, 2, 3, 4])  # 4

print(empty)   # []
print(data)    # ['a', 'b', 'c']
print(length)  # 4


3) ์ธ๋ฑ์‹ฑ & ์Šฌ๋ผ์ด์‹ฑ

  • ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘
  • ์Šฌ๋ผ์ด์‹ฑ์€ [start:end:step] (end๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Œ)

arr = [10, 20, 30, 40, 50]

print(arr[0])     # 10
print(arr[-1])    # 50 (๋’ค์—์„œ ์ฒซ ๋ฒˆ์งธ)
print(arr[1:4])   # [20, 30, 40]
print(arr[:3])    # [10, 20, 30]
print(arr[2:])    # [30, 40, 50]
print(arr[::2])   # 10, 30, 50
print(arr[::-1])  # 50, 40, 30, 20, 10


4) ๊ฐ’ ๋ณ€๊ฒฝํ•˜๊ธฐ (๊ฐ€๋ณ€์„ฑ)

๋ฆฌ์ŠคํŠธ๋Š” mutable(๊ฐ€๋ณ€) ํ•ฉ๋‹ˆ๋‹ค.

a = [1, 2, 3]
a[1] = 999
print(a)   # [1, 999, 3]


5) ์ž์ฃผ ์“ฐ๋Š” ๋ฉ”์„œ๋“œ

์ถ”๊ฐ€/์‚ฝ์ž…/์‚ญ์ œ

lst = [1, 2, 3]
lst.append(4)             # ๋’ค์— ์ถ”๊ฐ€: [1, 2, 3, 4]
lst.extend([5, 6])        # ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”๊ฐ€: [1, 2, 3, 4, 5, 6]
lst.insert(0, 100)        # ํŠน์ • ์œ„์น˜์— ์‚ฝ์ž…: [100, 1, 2, 3, 4, 5, 6]

lst.remove(3)             # ๊ฐ’ 3 ์ฒซ ๋ฒˆ์งธ๋งŒ ์ œ๊ฑฐ: [100, 1, 2, 4, 5, 6]
popped = lst.pop()        # ๋งจ ๋’ค ๊บผ๋‚ด๊ธฐ: popped=6, lst=[100, 1, 2, 4, 5]
popped2 = lst.pop(1)      # ์ธ๋ฑ์Šค 1 ๊บผ๋‚ด๊ธฐ: popped2=1, lst=[100, 2, 4, 5]

lst.clear()               # ๋ชจ๋‘ ์ง€์šฐ๊ธฐ: []

๊ฒ€์ƒ‰/๊ฐœ์ˆ˜/์ •๋ ฌ

nums = [5, 1, 5, 3, 2]

print(nums.index(5))      # 0 (์ฒซ ๋ฒˆ์งธ 5์˜ ์œ„์น˜)
print(nums.count(5))      # 2 (5์˜ ๊ฐœ์ˆ˜)

nums.sort()               # ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ: [1, 2, 3, 5, 5]
nums.sort(reverse=True)   # ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ: [5, 5, 3, 2, 1]

nums2 = [3, 1, 2]
print(sorted(nums2))              # [1, 2, 3] (์›๋ณธ ์œ ์ง€)
print(sorted(nums2, reverse=True))# [3, 2, 1]


6) ๋ฆฌ์ŠคํŠธ ๊ฒฐํ•ฉ/๋ณต์ œ

a = [1, 2]
b = [3, 4]
c = a + b           # [1, 2, 3, 4]

repeat = ["hi"] * 3 # ['hi', 'hi', 'hi']


7) ๋ฉค๋ฒ„์‹ญ ํ™•์ธ (in, not in)

fruits = ["apple", "banana", "cherry"]
print("banana" in fruits)     # True
print("grape" not in fruits)  # True


8) ๋ฐ˜๋ณต๋ฌธ๊ณผ ํ•จ๊ป˜ ์“ฐ๊ธฐ

items = ["a", "b", "c"]
for item in items:
    print(item)
# a
# b
# c

# ์ธ๋ฑ์Šค์™€ ๊ฐ’ ๋™์‹œ์—
for i, v in enumerate(items):
    print(i, v)
# 0 a
# 1 b
# 2 c


9) ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜ (์งง๊ณ  ๊ฐ•๋ ฅ!)

# 0~9์˜ ์ œ๊ณฑ ๋ฆฌ์ŠคํŠธ
squares = [x2 for x in range(10)]
# ํ™€์ˆ˜๋งŒ
odds = [x for x in range(10) if x % 2 == 1]
# ๋ฌธ์ž์—ด ๊ธธ์ด
words = ["hi", "python", "list"]
lengths = [len(w) for w in words]

print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
print(odds)     # [1, 3, 5, 7, 9]
print(lengths)  # [2, 6, 4]


10) 2์ฐจ์› ๋ฆฌ์ŠคํŠธ (ํ–‰๋ ฌ/ํ‘œ ํ˜•ํƒœ)

# 3x3 ํ–‰๋ ฌ
matrix = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9],
]

# ํ–‰/์—ด ์ ‘๊ทผ
print(matrix[0])      # [1, 2, 3]
print(matrix[1][2])   # 6

# ๋ชจ๋“  ์›์†Œ ์ถœ๋ ฅ
for row in matrix:
    for val in row:
        print(val, end=" ")
# 1 2 3 4 5 6 7 8 9


11) ํ”ํ•œ ํŒจํ„ด ์˜ˆ์ œ ๋ชจ์Œ

(1) ์ค‘๋ณต ์ œ๊ฑฐ (๊ธฐ๋ณธ)

nums = [1, 2, 2, 3, 3, 3]
unique = []
for n in nums:
    if n not in unique:
        unique.append(n)
print(unique)  # [1, 2, 3]

(2) ์ตœ๋Œ€/์ตœ์†Œ/ํ•ฉ/ํ‰๊ท 

nums = [10, 20, 30, 40]
print(max(nums))     # 40
print(min(nums))     # 10
print(sum(nums))     # 100
print(sum(nums) / len(nums))  # 25.0

(3) ํ•„ํ„ฐ๋ง (์กฐ๊ฑด์— ๋งž๋Š” ๊ฒƒ๋งŒ)

nums = [3, 10, 7, 20, 5]
evens = [n for n in nums if n % 2 == 0]  # ์ง์ˆ˜๋งŒ
greater10 = [n for n in nums if n > 10]  # 10 ์ดˆ๊ณผ
print(evens)     # [10, 20]
print(greater10) # [20]

(4) ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ ์ฒ˜๋ฆฌ

words = ["  apple ", "banana", " CHERRY  "]
clean = [w.strip().lower() for w in words]
print(clean)  # ['apple', 'banana', 'cherry']

(5) ๋ฆฌ์ŠคํŠธ ํ‰ํƒ„ํ™” (์ค‘์ฒฉ ํ’€๊ธฐ - 1๋‹จ๊ณ„)

nested = [[1, 2], [3, 4], [5]]
flat = []
for group in nested:
    for x in group:
        flat.append(x)
print(flat)  # [1, 2, 3, 4, 5]

(6) ์ •๋ ฌ ๊ธฐ์ค€ ์ปค์Šคํ„ฐ๋งˆ์ด์ฆˆ (key=)

words = ["apple", "banana", "kiwi", "grape"]
# ๊ธธ์ด ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ
words.sort(key=len)
print(words)  # ['kiwi', 'grape', 'apple', 'banana']

(7) ๋ถ„ํ• /๊ทธ๋ฃนํ•‘(์ฒญํฌ)

data = [1,2,3,4,5,6,7,8,9]
size = 3
chunks = [data[i:i+size] for i in range(0, len(data), size)]
print(chunks)  # [[1,2,3],[4,5,6],[7,8,9]]

(8) ์ค‘๋ณต ์นด์šดํŠธ (๊ฐ„๋‹จ ๋ฒ„์ „)

items = ["a", "b", "a", "c", "b", "a"]
counts = {}
for x in items:
    counts[x] = counts.get(x, 0) + 1
print(counts)  # {'a': 3, 'b': 2, 'c': 1}


12) ์ž์ฃผ ๊ฒช๋Š” ์‹ค์ˆ˜ & ํŒ

(1) ์Šฌ๋ผ์ด์‹ฑ์€ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค

a = [1, 2, 3]
b = a[:]        # ๋ณต์‚ฌ
b[0] = 999
print(a, b)     # [1, 2, 3] [999, 2, 3]

(2) ์–•์€ ๋ณต์‚ฌ vs ๊นŠ์€ ๋ณต์‚ฌ

import copy

a = [[1, 2], [3, 4]]
shallow = a[:]            # ์–•์€ ๋ณต์‚ฌ (๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ๋Š” ๊ณต์œ )
shallow[0][0] = 999
print(a)       # [[999, 2], [3, 4]]  <-- ์˜ํ–ฅ ๋ฐ›์Œ

a = [[1, 2], [3, 4]]
deep = copy.deepcopy(a)   # ๊นŠ์€ ๋ณต์‚ฌ
deep[0][0] = 999
print(a)       # [[1, 2], [3, 4]]    <-- ์˜ํ–ฅ ์—†์Œ

(3) list * n์œผ๋กœ 2์ฐจ์› ๋งŒ๋“ค ๋•Œ ์ฃผ์˜

# ์ž˜๋ชป๋œ ์˜ˆ: ๊ฐ™์€ ๋‚ด๋ถ€ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐ
rows, cols = 3, 3
bad = [[0]cols]rows
bad[0][0] = 1
print(bad)  # [[1,0,0],[1,0,0],[1,0,0]]  <-- ๋ชจ๋‘ ๋ฐ”๋€œ

# ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ: ๊ฐ ํ–‰์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ƒ์„ฑ
good = [[0 for in range(cols)] for in range(rows)]
good[0][0] = 1
print(good)  # [[1,0,0],[0,0,0],[0,0,0]]


13) ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ๋กœ ์—ฐ์Šตํ•˜๊ธฐ

(A) ์„ฑ์  ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ (ํ‰๊ท /์ตœ๊ณ /์ •๋ ฌ)

scores = [88, 92, 76, 81, 95, 68]

print("ํ•™์ƒ ์ˆ˜:", len(scores))
print("ํ‰๊ท :", round(sum(scores)/len(scores), 2))
print("์ตœ๊ณ  ์ ์ˆ˜:", max(scores))
print("์ตœ์ € ์ ์ˆ˜:", min(scores))

# ์ƒ์œ„ 3๋ช…
top3 = sorted(scores, reverse=True)[:3]
print("TOP 3:", top3)

# 70์  ๋ฏธ๋งŒ ๊ฒฝ๊ณ  ๋ชฉ๋ก
warnings = [s for s in scores if s < 70]
print("๊ฒฝ๊ณ :", warnings)

(B) ์‡ผํ•‘์นดํŠธ ์‹œ์Šคํ…œ (์ถ”๊ฐ€/์‚ญ์ œ/์ดํ•ฉ)

cart = []
prices = {"apple": 1000, "banana": 2000, "milk": 2500}

# ์ถ”๊ฐ€
cart.append("apple")
cart.extend(["banana", "milk", "apple"])

# ์‚ญ์ œ(์ฒซ ๋ฒˆ์งธ๋งŒ)
cart.remove("apple")

# ์ดํ•ฉ ๊ณ„์‚ฐ
total = sum(prices[item] for item in cart)
print("์นดํŠธ:", cart)
print("์ด์•ก:", total)

(C) ํ…์ŠคํŠธ ํด๋ฆฌ๋„ˆ (๊ณต๋ฐฑ/์†Œ๋ฌธ์ž/์ค‘๋ณต ์ œ๊ฑฐ)

texts = ["  Hello ", "WORLD", "hello", "Python  ", "world  "]
clean = [t.strip().lower() for t in texts]

# ์ค‘๋ณต ์ œ๊ฑฐ(์ˆœ์„œ ์œ ์ง€)
unique = []
for t in clean:
    if t not in unique:
        unique.append(t)

print("์ •์ œ:", clean)
print("์œ ๋‹ˆํฌ:", unique)  # ['hello', 'world', 'python']


14) ์Šค์Šค๋กœ ํ•ด๋ณผ ์—ฐ์Šต๋ฌธ์ œ (์ •๋‹ต ์—†์ด ๋„์ „!)

  1. ๋ฆฌ์ŠคํŠธ์—์„œ ์ตœ๋นˆ๊ฐ’(๊ฐ€์žฅ ๋งŽ์ด ๋‚˜์˜จ ๊ฐ’)์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”.
  2. ๋ฌธ์ž์—ด ๋ฆฌ์ŠคํŠธ์—์„œ ๊ธธ์ด๊ฐ€ ์ง์ˆ˜์ธ ๋‹จ์–ด๋งŒ ๋ชจ์•„ ์ƒˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ์„ธ์š”.
  3. 2์ฐจ์› ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ ํ–‰์˜ ํ•ฉ์„ ๊ตฌํ•ด [ํ•ฉ1, ํ•ฉ2, ...] ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.
  4. ์ˆซ์ž ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์„ธ์š”.
  5. ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ k๊ฐœ์”ฉ ํšŒ์ „(rotate)ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์„ธ์š”. (์˜ˆ: [1,2,3,4,5]๋ฅผ ์˜ค๋ฅธ์ชฝ์œผ๋กœ 2์นธ ํšŒ์ „ → [4,5,1,2,3])

15) ์š”์•ฝ ์ฒดํฌํฌ์ธํŠธ

  • ๋ฆฌ์ŠคํŠธ๋Š” ์ˆœ์„œ/๊ฐ€๋ณ€์„ฑ์ด ํ•ต์‹ฌ
  • ์ธ๋ฑ์‹ฑ/์Šฌ๋ผ์ด์‹ฑ์œผ๋กœ ์ ‘๊ทผ
  • append, extend, insert, remove, pop, sort, sorted ์ž์ฃผ ์‚ฌ์šฉ
  • ์ปดํ”„๋ฆฌํ—จ์…˜์œผ๋กœ ์งง๊ณ  ๋ช…ํ™•ํ•˜๊ฒŒ
  • 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋Š” ์ƒ์„ฑ ์‹œ ์ฐธ์กฐ ๊ณต์œ  ์ฃผ์˜
  • ๊นŠ์€ ๋ณต์‚ฌ ํ•„์š”ํ•˜๋ฉด copy.deepcopy

๋Œ“๊ธ€