์ฝ”๋“œ - ํŒจ์บ  ์ˆ˜์—… ์ฝ”๋“œ ์ฐธ๊ณ  (ํŒจ์บ  ์ˆ˜์—… ์ •๋ฆฌ)

 

<์ด์ „ ๊ธ€>

https://silvercoding.tistory.com/23

 

[python ์‹ฌํ™”] 6. ์ž๋ฃŒํ˜• (์ง€๋Šฅํ˜• ๋ฆฌ์ŠคํŠธ, ์ œ๋„ˆ๋ ˆ์ดํ„ฐ, ๊ฐ€๋ณ€๋ถˆ๋ณ€, ์ •๋ ฌ)

์ฝ”๋“œ - ํŒจ์บ  ์ˆ˜์—… ์ฝ”๋“œ ์ฐธ๊ณ  (ํŒจ์บ  ์ˆ˜์—… ์ •๋ฆฌ) <์ด์ „ ๊ธ€> https://silvercoding.tistory.com/22 https://silvercoding.tistory.com/21 https://silvercoding.tistory.com/20 https://silvercoding.tistory.com/19..

silvercoding.tistory.com

 

 

- ํ•ด์‹œํ…Œ์ด๋ธ” (hashtable) 

ํ•ด์‹œํ…Œ์ด๋ธ”์€ ์ž‘์€ ๋ฆฌ์†Œ์Šค๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. 

ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ key์™€ value๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. 

 

*** Hash๊ฐ’์„ ํ™•์ธ ํ•จ์œผ๋กœ์จ ์ค‘๋ณต์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Œ . 

# Hash ๊ฐ’ ํ™•์ธ  ---> ์ค‘๋ณต์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ์•ˆ๋˜๋Š”์ง€ , 
t1 = (10, 20, (30, 40, 50))
t2 = (10, 20, [30, 40, 50])

print('EX1-2 - ', hash(t1))
# print('EX1-3 - ', hash(t2))  #---> ๋ฆฌ์ŠคํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด์‰ฌ ์“ธ ์ˆ˜ ์—†์Œ 

 

 

 

- ์ง€๋Šฅํ˜• ๋”•์…”๋„ˆ๋ฆฌ (Comprehending Dict) 

(์˜ˆ์ œ) ๊ตญ๊ฐ€์ฝ”๋“œ csv ํŒŒ์ผ -> tuple ๋ณ€ํ™˜ -> Dictionary ๋ณ€ํ™˜ 

(1) csv ํŒŒ์ผ ๋ถˆ๋Ÿฌ์™€์„œ tuple๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ( ํŒŒ์ผ: ํŒจ์บ  ์ œ๊ณต

import csv
from os import kill
from typing import Counter 

# ์™ธ๋ถ€ CSV TO List of tuple  
with open('./resources/test1.csv', 'r', encoding='UTF-8') as f:
    temp = csv.reader(f)
    # Header Skip
    next(temp)
    print()
    # ๋ณ€ํ™˜ 
    NA_CODES = [tuple(x) for x in temp]

print('EX2-1 - ')
print(NA_CODES)

๋‘์ค„๊นŒ์ง€๋งŒ ์บก์ณ. ์ตœ์ข…์ ์œผ๋กœ ๋‚˜๋ผ ์ฝ”๋“œ ํŠœํ”Œ์ด ๋“ค์–ด๊ฐ„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. 

 

 

(2) Dictionary ๋กœ ๋ณ€ํ™˜ (์ง€๋Šฅํ˜• Dictionary ์‚ฌ์šฉ) 

n_code1 = {country: code for country, code in NA_CODES}
n_code2 = {country.upper() : code for country, code in NA_CODES}

n_code2๋Š” key๊ฐ’์„ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์ฃผ๊ธฐ๊นŒ์ง€ ํ•œ ๊ฒƒ. 

 

 

 

 

 

- Dict Setdefault  

source = (('k1', 'val1'),
            ('k1', 'val2'),
            ('k2', 'val3'),
            ('k2', 'val4'),
            ('k2', 'val5'))

new_dict1 = {}
new_dict2 = {}

(1) No use setdefault 

for k, v in source:
    if k in new_dict1:
        new_dict1[k].append(v)
    else:
        new_dict1[k] = [v]

print('EX3-1 - ', new_dict1)

์ค‘๋ณต๋˜๋Š” key๊ฐ€ ์žˆ์œผ๋ฉด, ๋ฆฌ์ŠคํŠธ์— appendํ•ด์„œ dict๋ฅผ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ์ด๋‹ค. 

 

 

(2) Use setdefault ( ์ด๊ฒƒ์˜ ์„ฑ๋Šฅ์ด ๋” ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค. ) 

for k, v in source:
    new_dict2.setdefault(k, []).append(v)

print('EX3-2 - ', new_dict2)

setdefault๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด if๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ์ด๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•œ์ค„๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

 

 

 

- ์‚ฌ์šฉ์ž ์ •์˜ dict ์ƒ์† 

class UserDict(dict):
    def __missing__(self, key):
        print('Called : __missing__')
        if isinstance(key, str):
            raise KeyError(key)
        return self[str(key)]

    def get(self, key, default=None):
        print("Called : __getitem__")
        try:
            return self[key]
        except KeyError:
            return default

    def __contains__(self, key):
        print("Called : __contains__")
        return key in self.keys() or str(key) in self.keys()

dict๋ฅผ ์ƒ์†๋ฐ›์•„์„œ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

user_dict1 = UserDict(one=1, two=2)
user_dict2 = UserDict({"one" : 1, "two" : 2})
user_dict3 = UserDict([('one', 1), ('two', 2)])

์ด๋ ‡๊ฒŒ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ค„ ์ˆ˜ ์žˆ๋‹ค. 

 

print('EX4-1 - ', user_dict1, user_dict2, user_dict3)
print('EX4-2 - ', user_dict2.get("two"))
print('EX4-3 - ', 'one' in user_dict3)
# print('EX4-4 - ', user_dict3['three'])
print('EX4-5 - ', user_dict3.get('three'))
print('EX4-6 - ', 'three' in user_dict3)

 

์ฃผ์„์ฒ˜๋ฆฌํ•œ EX4-4 ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด 

__missing__ ์ด ํ˜ธ์ถœ๋˜๋ฉด์„œ ์œ„์—์„œ ์ •์˜ํ–ˆ๋˜ ํ‚ค์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. 

 

 

 

 

- Immutable Dict 

from types import MappingProxyType

d = {'key1' : 'TEST1'}
# Read Only
d_frozen = MappingProxyType(d)

print('EX5-1 - ', d, id(d))
print('EX5-2 - ', d_frozen, id(d_frozen))
print('EX5-3 - ', d is d_frozen, d == d_frozen)

# d_frozen['key1'] = 'TEST2'  # ===> ๋ฐ”๋€Œ์ง€ ์•Š์Œ 

# ์›๋ณธ์€ ์ˆ˜์ • ๊ฐ€๋Šฅ 
d['key2'] = 'TEST2'
print('EX5-4 - ', d)

 

d์™€ d_frozen ์€ ๋‹ค๋ฅธ ๊ฐ์ฒด (๋‹ค๋ฅธ id) ์ด๊ณ , ๊ฐ’(๋‚ด์šฉ)์€ ๊ฐ™๋‹ค๊ณ  ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

d_frozen์„ ์ˆ˜์ •ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค. ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค. 

์›๋ณธ์ธ d๋Š” ์ˆ˜์ •(์ถ”๊ฐ€, ์‚ญ์ œ, ๋ณ€๊ฒฝ)์ด ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

 

 

- Set 

s1 = {'Apple', 'Orange', 'Apple', 'Orange', 'Kiwi'}
s2 = set(['Apple', 'Orange', 'Apple', 'Orange', 'Kiwi'])
s3 = {3}
s4 = set()  # Not {}
s5 = frozenset({'Apple', 'Orange', 'Apple', 'Orange', 'Kiwi'})

ํ•œ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์€ ๋น„์–ด์žˆ๋Š” set๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋• set() ์„ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค. {} ์œผ๋กœ ์ƒ์„ฑํ•˜๋ฉด dict ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. 

# ์ถ”๊ฐ€ 
s1.add('Melon')

# ์ถ”๊ฐ€ ๋ถˆ๊ฐ€ 
# s5.add('Melon')

print('EX6-1 - ',  s1, type(s1))
print('EX6-2 - ',  s2, type(s2))
print('EX6-3 - ',  s3, type(s3))
print('EX6-4 - ',  s4, type(s4))
print('EX6-5 - ',  s5, type(s5))

Immutable Dict์™€ ๊ฐ™์ด frozenset์œผ๋กœ ์ˆ˜์ •์ด ๋ถˆ๊ฐ€ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

- ์„ ์–ธ ์ตœ์ ํ™” 

a = {5}  # ---> ์ด๊ฒŒ ๋” ๋น ๋ฅด๋‹ค. 
b = set([10])

 *** ์ฆ๋ช… 

from dis import dis 
print('EX6-5 - ')
print(dis('{10}'))

print('EX6-6 - ')
print(dis("set([10])"))

dis๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹คํ–‰๋˜๋Š” ์ˆœ์„œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

{10} ์˜ ์ ˆ์ฐจ๊ฐ€ ๋” ์ ๋‹ค!

 

 

- ์ง€๋Šฅํ˜• ์ง‘ํ•ฉ (Comprehending Set) 

from unicodedata import name

print('EX7-1 - ')
print({name(chr(i), "") for i in range(0, 256)})

๋”•์…”๋„ˆ๋ฆฌ์™€ ๋น„์Šทํ•˜๊ฒŒ for๋ฌธ์„ {}์•ˆ์— ๋„ฃ์–ด์ฃผ์–ด ์ง€๋Šฅํ˜• ์ง‘ํ•ฉ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts