KR_Dictionary - somaz94/python-study GitHub Wiki

Python ๋”•์…”๋„ˆ๋ฆฌ(Dictionary) ๊ฐœ๋… ์ •๋ฆฌ


1๏ธโƒฃ ๋”•์…”๋„ˆ๋ฆฌ(Dictionary)๋ž€?

๋”•์…”๋„ˆ๋ฆฌ๋Š” ํ‚ค(Key)์™€ ๊ฐ’(Value)์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ž๋ฃŒํ˜•์ด๋‹ค. ์‹ค์ƒํ™œ์˜ ์‚ฌ์ „๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋‹จ์–ด(ํ‚ค)์™€ ๊ทธ ์˜๋ฏธ(๊ฐ’)๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค.

# ๋”•์…”๋„ˆ๋ฆฌ ์ƒ์„ฑ ๋ฐฉ๋ฒ•
empty = {}                                    # ๋นˆ ๋”•์…”๋„ˆ๋ฆฌ
person = {'name': 'John', 'age': 30}          # ๊ธฐ๋ณธ์ ์ธ ๋”•์…”๋„ˆ๋ฆฌ
scores = dict(math=90, english=85)            # dict() ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ
mixed = {
    'str': 'hello',                           # ๋ฌธ์ž์—ด ๊ฐ’
    'list': [1, 2, 3],                        # ๋ฆฌ์ŠคํŠธ ๊ฐ’
    'tuple': (4, 5, 6)                        # ํŠœํ”Œ ๊ฐ’
}

โœ… Tip:

  • ํ‚ค(Key)๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž๋ฃŒํ˜•๋งŒ ๊ฐ€๋Šฅ
  • ๊ฐ’(Value)์€ ๋ชจ๋“  ์ž๋ฃŒํ˜• ๊ฐ€๋Šฅ
  • ์ค‘๊ด„ํ˜ธ {}๋กœ ํ‘œํ˜„


2๏ธโƒฃ ๋”•์…”๋„ˆ๋ฆฌ ์ˆ˜์ •๊ณผ ์‚ญ์ œ

# ๋”•์…”๋„ˆ๋ฆฌ ์ˆ˜์ •
person = {'name': 'John', 'age': 30}
person['age'] = 31                    # ๊ฐ’ ์ˆ˜์ •
person['city'] = 'Seoul'              # ์ƒˆ๋กœ์šด ์Œ ์ถ”๊ฐ€

# ๋”•์…”๋„ˆ๋ฆฌ ์‚ญ์ œ
del person['age']                     # ํŠน์ • ํ‚ค-๊ฐ’ ์Œ ์‚ญ์ œ
person.clear()                        # ๋ชจ๋“  ํ•ญ๋ชฉ ์‚ญ์ œ

โœ… ์ฃผ์˜์‚ฌํ•ญ:

  • ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ‚ค๋กœ ์ ‘๊ทผํ•˜๋ฉด KeyError ๋ฐœ์ƒ
  • ๊ฐ™์€ ํ‚ค๊ฐ€ ์ค‘๋ณต๋˜๋ฉด ๋งˆ์ง€๋ง‰ ๊ฐ’๋งŒ ์œ ํšจ
  • ํ‚ค๋กœ ๋ฆฌ์ŠคํŠธ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ (ํŠœํ”Œ์€ ๊ฐ€๋Šฅ)


3๏ธโƒฃ ๋”•์…”๋„ˆ๋ฆฌ ๊ด€๋ จ ๋ฉ”์„œ๋“œ

person = {
    'name': 'John',
    'age': 30,
    'city': 'Seoul'
}

# ํ‚ค ๋ชฉ๋ก ์–ป๊ธฐ
keys = person.keys()                  # dict_keys ๊ฐ์ฒด ๋ฐ˜ํ™˜
key_list = list(person.keys())        # ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜

# ๊ฐ’ ๋ชฉ๋ก ์–ป๊ธฐ
values = person.values()              # dict_values ๊ฐ์ฒด ๋ฐ˜ํ™˜
value_list = list(person.values())    # ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜

# ํ‚ค-๊ฐ’ ์Œ ์–ป๊ธฐ
items = person.items()                # dict_items ๊ฐ์ฒด ๋ฐ˜ํ™˜
item_list = list(person.items())      # ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜

# ํ‚ค๋กœ ๊ฐ’ ์–ป๊ธฐ
age = person.get('age')               # ํ‚ค๊ฐ€ ์žˆ์œผ๋ฉด ๊ฐ’ ๋ฐ˜ํ™˜
age = person.get('height', 0)         # ํ‚ค๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ๊ฐ’ ๋ฐ˜ํ™˜

# ํ‚ค ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ
'name' in person                      # True
'email' in person                     # False

# ํ•ญ๋ชฉ ์ถ”๊ฐ€/์ˆ˜์ •
person.update({'email': '[email protected]', 'age': 31})  # ์—ฌ๋Ÿฌ ํ•ญ๋ชฉ ํ•œ๋ฒˆ์— ์ถ”๊ฐ€/์ˆ˜์ •

# ํ•ญ๋ชฉ ์ œ๊ฑฐ
removed_value = person.pop('age')     # ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ํ•ญ๋ชฉ ์ œ๊ฑฐ ํ›„ ๊ฐ’ ๋ฐ˜ํ™˜
random_item = person.popitem()        # ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ์ œ๊ฑฐ ํ›„ (ํ‚ค, ๊ฐ’) ํŠœํ”Œ ๋ฐ˜ํ™˜

# ๋”•์…”๋„ˆ๋ฆฌ ๋ณต์‚ฌ
person_copy = person.copy()           # ์–•์€ ๋ณต์‚ฌ

โœ… ์ฃผ์š” ๋ฉ”์„œ๋“œ:

  • keys(): ๋ชจ๋“  ํ‚ค๋ฅผ dict_keys ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜
  • values(): ๋ชจ๋“  ๊ฐ’์„ dict_values ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜
  • items(): ๋ชจ๋“  ํ‚ค-๊ฐ’ ์Œ์„ dict_items ๊ฐ์ฒด๋กœ ๋ฐ˜ํ™˜
  • get(): ํ‚ค๋กœ ๊ฐ’์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ค๊ธฐ
  • clear(): ๋ชจ๋“  ํ•ญ๋ชฉ ์‚ญ์ œ
  • update(): ๋‹ค๋ฅธ ๋”•์…”๋„ˆ๋ฆฌ์˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€
  • pop(): ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ํ•ญ๋ชฉ ์ œ๊ฑฐ ํ›„ ๊ฐ’ ๋ฐ˜ํ™˜
  • popitem(): ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ์ œ๊ฑฐ ํ›„ (ํ‚ค, ๊ฐ’) ํŠœํ”Œ ๋ฐ˜ํ™˜
  • copy(): ๋”•์…”๋„ˆ๋ฆฌ ์–•์€ ๋ณต์‚ฌ


4๏ธโƒฃ ๋”•์…”๋„ˆ๋ฆฌ ํ™œ์šฉ

# ์ค‘์ฒฉ ๋”•์…”๋„ˆ๋ฆฌ
users = {
    'user1': {
        'name': 'John',
        'age': 30,
        'scores': {'math': 90, 'english': 85}
    },
    'user2': {
        'name': 'Jane',
        'age': 25,
        'scores': {'math': 95, 'english': 90}
    }
}

# ๋”•์…”๋„ˆ๋ฆฌ ์ˆœํšŒ
for key in users:
    print(key, users[key])

for key, value in users.items():
    print(key, value)

# ๋”•์…”๋„ˆ๋ฆฌ ๋ณ‘ํ•ฉ
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3, 'd': 4}
merged = {**dict1, **dict2}          # Python 3.5+

# Python 3.9 ์ด์ƒ์—์„œ ์ง€์›ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ๋ณ‘ํ•ฉ ์—ฐ์‚ฐ์ž
# merged = dict1 | dict2              # Python 3.9+

โœ… ํ™œ์šฉ Tip:

  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์กฐํ™”ํ•  ๋•Œ ์œ ์šฉ
  • JSON ํ˜•์‹๊ณผ ํ˜ธํ™˜์„ฑ์ด ์ข‹์Œ
  • ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ๋น ๋ฅธ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ
  • ์ค‘์ฒฉ ๊ตฌ์กฐ๋กœ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํ‘œํ˜„ ๊ฐ€๋Šฅ


5๏ธโƒฃ ๋”•์…”๋„ˆ๋ฆฌ ์ปดํ”„๋ฆฌํ—จ์…˜

๋”•์…”๋„ˆ๋ฆฌ ์ปดํ”„๋ฆฌํ—จ์…˜(Dictionary Comprehension)์€ ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ฐ„๊ฒฐํ•œ ๊ตฌ๋ฌธ์œผ๋กœ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

# ๊ธฐ๋ณธ ํ˜•์‹
squares = {x: x**2 for x in range(6)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# ์กฐ๊ฑด์‹ ์ถ”๊ฐ€
even_squares = {x: x**2 for x in range(6) if x % 2 == 0}
# {0: 0, 2: 4, 4: 16}

# ํ‚ค-๊ฐ’ ๋ณ€ํ™˜
original = {'a': 1, 'b': 2, 'c': 3}
swapped = {v: k for k, v in original.items()}
# {1: 'a', 2: 'b', 3: 'c'}

# ์ค‘์ฒฉ ๋ฃจํ”„ ์‚ฌ์šฉ
matrix = {(i, j): i*j for i in range(3) for j in range(3)}
# {(0, 0): 0, (0, 1): 0, (0, 2): 0, (1, 0): 0, (1, 1): 1, (1, 2): 2, (2, 0): 0, (2, 1): 2, (2, 2): 4}

# if-else ์‚ฌ์šฉ
status = {x: 'even' if x % 2 == 0 else 'odd' for x in range(6)}
# {0: 'even', 1: 'odd', 2: 'even', 3: 'odd', 4: 'even', 5: 'odd'}

# ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ
word = "hello"
char_count = {char: word.count(char) for char in word}
# {'h': 1, 'e': 1, 'l': 2, 'o': 1}

โœ… ๋”•์…”๋„ˆ๋ฆฌ ์ปดํ”„๋ฆฌํ—จ์…˜ Tip:

  • ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์ปดํ”„๋ฆฌํ—จ์…˜์€ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค
  • ๊ธฐ์กด ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋งํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค
  • ์กฐ๊ฑด๋ฌธ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” if ์ ˆ์„ for ์ ˆ ๋’ค์— ์œ„์น˜์‹œํ‚จ๋‹ค
  • ๋ณ€ํ™˜ ๋กœ์ง์ด ๋ณต์žกํ•  ๋•Œ๋Š” ์ผ๋ฐ˜ ๋ฐ˜๋ณต๋ฌธ์ด ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ๋‹ค


6๏ธโƒฃ ๊ณ ๊ธ‰ ๋”•์…”๋„ˆ๋ฆฌ ๊ธฐ๋Šฅ

1. ๋ถˆ๋ณ€ ๋”•์…”๋„ˆ๋ฆฌ (MappingProxyType)

Python 3.3 ์ด์ƒ์—์„œ๋Š” types ๋ชจ๋“ˆ์˜ MappingProxyType์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ๊ธฐ ์ „์šฉ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

from types import MappingProxyType

original = {'a': 1, 'b': 2}
read_only = MappingProxyType(original)

# ์ฝ๊ธฐ๋Š” ๊ฐ€๋Šฅ
print(read_only['a'])  # 1

# ์ˆ˜์ • ์‹œ๋„๋Š” ์˜ค๋ฅ˜ ๋ฐœ์ƒ
try:
    read_only['c'] = 3
except TypeError as e:
    print(e)  # 'mappingproxy' object does not support item assignment

# ์›๋ณธ ์ˆ˜์ • ์‹œ ์ฝ๊ธฐ ์ „์šฉ ๋ทฐ์—๋„ ๋ฐ˜์˜๋จ
original['a'] = 100
print(read_only['a'])  # 100

2. defaultdict

ํ‚ค๊ฐ€ ์—†์„ ๋•Œ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ์ด๋‹ค. collections ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•œ๋‹ค.

from collections import defaultdict

# ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ •์ˆ˜ 0 ์‚ฌ์šฉ
int_dict = defaultdict(int)
print(int_dict['non_existent_key'])  # 0

# ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋ฆฌ์ŠคํŠธ ์‚ฌ์šฉ
list_dict = defaultdict(list)
list_dict['fruits'].append('apple')
list_dict['fruits'].append('banana')
print(list_dict['fruits'])  # ['apple', 'banana']

# ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ํ•จ์ˆ˜ ์ •์˜
def default_factory():
    return 'default value'

custom_dict = defaultdict(default_factory)
print(custom_dict['key'])  # 'default value'

# ๋‹จ์–ด ๋นˆ๋„์ˆ˜ ์„ธ๊ธฐ
text = "hello world hello python world python"
word_count = defaultdict(int)
for word in text.split():
    word_count[word] += 1
print(dict(word_count))  # {'hello': 2, 'world': 2, 'python': 2}

3. Counter

์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ํŠนํ™”๋œ ๋”•์…”๋„ˆ๋ฆฌ์ด๋‹ค. ์—ญ์‹œ collections ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•œ๋‹ค.

from collections import Counter

# ๋ฌธ์ž์—ด์—์„œ ๋ฌธ์ž ๋นˆ๋„ ์„ธ๊ธฐ
char_count = Counter("hello world")
print(char_count)  # Counter({'l': 3, 'o': 2, ' ': 1, 'h': 1, 'e': 1, 'w': 1, 'r': 1, 'd': 1})

# ๋ฆฌ์ŠคํŠธ์—์„œ ์š”์†Œ ๋นˆ๋„ ์„ธ๊ธฐ
fruit_basket = ['apple', 'orange', 'apple', 'banana', 'orange', 'apple']
fruit_count = Counter(fruit_basket)
print(fruit_count)  # Counter({'apple': 3, 'orange': 2, 'banana': 1})

# ๊ฐ€์žฅ ํ”ํ•œ ์š”์†Œ ์ฐพ๊ธฐ
print(fruit_count.most_common(2))  # [('apple', 3), ('orange', 2)]

# ์‚ฐ์ˆ  ์—ฐ์‚ฐ
counter1 = Counter(['a', 'b', 'c', 'a'])
counter2 = Counter(['a', 'd', 'e'])
print(counter1 + counter2)  # Counter({'a': 3, 'b': 1, 'c': 1, 'd': 1, 'e': 1})
print(counter1 - counter2)  # Counter({'b': 1, 'c': 1, 'a': 1})

4. OrderedDict

Python 3.7 ์ด์ „ ๋ฒ„์ „์—์„œ ๋”•์…”๋„ˆ๋ฆฌ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ ํด๋ž˜์Šค์ด๋‹ค. 3.7 ์ดํ›„๋กœ๋Š” ์ผ๋ฐ˜ ๋”•์…”๋„ˆ๋ฆฌ๋„ ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜์ง€๋งŒ, ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๋•Œ ์—ฌ์ „ํžˆ ์œ ์šฉํ•˜๋‹ค.

from collections import OrderedDict

# ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋”•์…”๋„ˆ๋ฆฌ ์ƒ์„ฑ
ordered = OrderedDict([('a', 1), ('b', 2), ('c', 3)])

# ํ•ญ๋ชฉ ์ด๋™
ordered.move_to_end('a')
print(ordered)  # OrderedDict([('b', 2), ('c', 3), ('a', 1)])

# ๋งˆ์ง€๋ง‰ ํ•ญ๋ชฉ ์ œ๊ฑฐ
last_item = ordered.popitem()
print(last_item)  # ('a', 1)

# ์ˆœ์„œ ๋น„๊ต
od1 = OrderedDict([('a', 1), ('b', 2)])
od2 = OrderedDict([('b', 2), ('a', 1)])
print(od1 == od2)  # False - ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฆ„

# ์ผ๋ฐ˜ ๋”•์…”๋„ˆ๋ฆฌ์—์„œ๋Š” ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์Œ
d1 = {'a': 1, 'b': 2}
d2 = {'b': 2, 'a': 1}
print(d1 == d2)  # True - ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ๋„ ๊ฐ™์Œ


7๏ธโƒฃ ๋”•์…”๋„ˆ๋ฆฌ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ

import copy

# ์–•์€ ๋ณต์‚ฌ
original = {'name': 'John', 'hobbies': ['reading', 'swimming']}
shallow_copy = original.copy()  # ๋˜๋Š” dict(original)

# ๋‚ด๋ถ€ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋Š” ์ฐธ์กฐ ๊ณต์œ 
shallow_copy['hobbies'].append('running')
print(original['hobbies'])  # ['reading', 'swimming', 'running'] - ์›๋ณธ๋„ ๋ณ€๊ฒฝ๋จ

# ๊นŠ์€ ๋ณต์‚ฌ
original = {'name': 'John', 'hobbies': ['reading', 'swimming']}
deep_copy = copy.deepcopy(original)

# ๋‚ด๋ถ€ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋„ ๋ณต์‚ฌ
deep_copy['hobbies'].append('running')
print(original['hobbies'])  # ['reading', 'swimming'] - ์›๋ณธ์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
print(deep_copy['hobbies'])  # ['reading', 'swimming', 'running']

โœ… ๋ณต์‚ฌ ๊ด€๋ จ Tip:

  • ๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์ค‘์ฒฉ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€์ง€ ์•Š์œผ๋ฉด copy() ๋ฉ”์„œ๋“œ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค
  • ๋‚ด๋ถ€์— ๋ฆฌ์ŠคํŠธ, ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ™์€ ๊ฐ€๋ณ€ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•œ๋‹ค๋ฉด copy.deepcopy() ์‚ฌ์šฉ
  • ๊นŠ์€ ๋ณต์‚ฌ๋Š” ๋ชจ๋“  ์ค‘์ฒฉ ๊ฐ์ฒด๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ ๋น„์šฉ์ด ๋” ๋†’๋‹ค


8๏ธโƒฃ ๋”•์…”๋„ˆ๋ฆฌ์˜ ์„ฑ๋Šฅ ํŠน์„ฑ

๋”•์…”๋„ˆ๋ฆฌ๋Š” ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด ๋น ๋ฅธ ๊ฒ€์ƒ‰, ์‚ฝ์ž…, ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

import time
import timeit

# ๋”•์…”๋„ˆ๋ฆฌ vs ๋ฆฌ์ŠคํŠธ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ๋น„๊ต
def dict_lookup(dictionary, key):
    return dictionary.get(key)

def list_lookup(item_list, key):
    for k, v in item_list:
        if k == key:
            return v
    return None

# ๋ฐ์ดํ„ฐ ์ค€๋น„
size = 10000
dict_data = {str(i): i for i in range(size)}
list_data = [(str(i), i) for i in range(size)]

# ๊ฒ€์ƒ‰ ์‹œ๊ฐ„ ์ธก์ •
dict_time = timeit.timeit(
    lambda: dict_lookup(dict_data, str(size-1)),
    number=10000
)
list_time = timeit.timeit(
    lambda: list_lookup(list_data, str(size-1)),
    number=10000
)

print(f"๋”•์…”๋„ˆ๋ฆฌ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„: {dict_time:.6f}์ดˆ")
print(f"๋ฆฌ์ŠคํŠธ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„: {list_time:.6f}์ดˆ")
print(f"๋”•์…”๋„ˆ๋ฆฌ๊ฐ€ ์•ฝ {list_time/dict_time:.1f}๋ฐฐ ๋น ๋ฆ„")

๋”•์…”๋„ˆ๋ฆฌ ์—ฐ์‚ฐ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:

์—ฐ์‚ฐ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„ ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„
ํ‚ค ์กฐํšŒ O(1) O(n)
ํ‚ค ์‚ฝ์ž… O(1) O(n)
ํ‚ค ์‚ญ์ œ O(1) O(n)
ํ‚ค ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ O(1) O(n)
๋ชจ๋“  ํ•ญ๋ชฉ ์ˆœํšŒ O(n) O(n)

โœ… ์„ฑ๋Šฅ ๊ด€๋ จ Tip:

  • ๋”•์…”๋„ˆ๋ฆฌ๋Š” ํ•ด์‹œ ์ถฉ๋Œ์ด ์ ์„ ๋•Œ ๊ฐ€์žฅ ํšจ์œจ์ ์ด๋‹ค
  • ํ‚ค๋กœ ๋ถˆ๋ณ€ ๊ฐ์ฒด(๋ฌธ์ž์—ด, ์ˆซ์ž, ํŠœํ”Œ)๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์‹œ ๊ฐ’์ด ์ผ๊ด€์ ์œผ๋กœ ์œ ์ง€๋œ๋‹ค
  • Python 3.6๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ตœ์ ํ™”๋˜์–ด ์ด์ „ ๋ฒ„์ „๋ณด๋‹ค ์•ฝ 20-25% ๋” ํšจ์œจ์ ์ด๋‹ค
  • ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์ ์ด๋‹ค


9๏ธโƒฃ ์‹ค์ œ ํ™œ์šฉ ์˜ˆ์ œ

1. ๋ฐ์ดํ„ฐ ์บ์‹ฑ

def get_user_data(user_id, cache={}):
    if user_id in cache:
        print(f"์บ์‹œ์—์„œ ์‚ฌ์šฉ์ž {user_id} ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ")
        return cache[user_id]
    
    print(f"๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‚ฌ์šฉ์ž {user_id} ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ")
    # ์—ฌ๊ธฐ์„œ๋Š” ์‹ค์ œ DB ์กฐํšŒ ๋Œ€์‹  ์‹œ๋ฎฌ๋ ˆ์ด์…˜
    data = {'id': user_id, 'name': f'User {user_id}', 'age': 20 + (user_id % 10)}
    cache[user_id] = data
    return data

# ์ฒซ ๋ฒˆ์งธ ํ˜ธ์ถœ์€ "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค"์—์„œ ๊ฐ€์ ธ์˜ด
print(get_user_data(1))
# ๋‘ ๋ฒˆ์งธ ํ˜ธ์ถœ์€ ์บ์‹œ์—์„œ ๊ฐ€์ ธ์˜ด
print(get_user_data(1))

2. ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„

# ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ๊ทธ๋ž˜ํ”„ ํ‘œํ˜„
graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
}

# ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰(DFS)
def dfs(graph, start, visited=None):
    if visited is None:
        visited = set()
    visited.add(start)
    print(start, end=' ')
    
    for neighbor in graph[start]:
        if neighbor not in visited:
            dfs(graph, neighbor, visited)
    
    return visited

print("DFS ํƒ์ƒ‰ ๊ฒฐ๊ณผ:", end=' ')
dfs(graph, 'A')  # A B D E F C

3. ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ

def word_frequency(text):
    # ๋ฌธ์ž ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜
    words = text.lower().split()
    # ๋‹จ์–ด ๋นˆ๋„์ˆ˜ ๊ณ„์‚ฐ
    frequency = {}
    for word in words:
        # ๊ตฌ๋‘์  ์ œ๊ฑฐ
        word = word.strip('.,!?;:()[]{}""\'')
        if word:
            frequency[word] = frequency.get(word, 0) + 1
    return frequency

text = "Python is amazing. Python is a great programming language."
print(word_frequency(text))
# {'python': 2, 'is': 2, 'amazing.': 1, 'a': 1, 'great': 1, 'programming': 1, 'language.': 1}

โœ… ํ™œ์šฉ ์‚ฌ๋ก€:

  • ๋ฉ”๋ชจ์ด์ œ์ด์…˜(์ด์ „ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ ์ €์žฅ)
  • ์„ค์ •/ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ
  • ๊ฐ์ฒด ์†์„ฑ ์ €์žฅ
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ ˆ์ฝ”๋“œ ํ‘œํ˜„
  • ๊ทธ๋ž˜ํ”„, ํŠธ๋ฆฌ ๋“ฑ ์ž๋ฃŒ๊ตฌ์กฐ ๊ตฌํ˜„
  • JSON ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ
  • ์บ์‹ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜
  • ์ƒํƒœ ๊ด€๋ฆฌ


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