[Python ์ž๋ฃŒ๊ตฌ์กฐ] Hash(ํ•ด์‹œ)

2021. 1. 16. 02:14ใ†๐Ÿ“š Algorithm/๐Ÿ“• Python ๋ฌธ๋ฒ•

๋ฐ˜์‘ํ˜•

 

ํŒŒ์ด์ฌ์—์„œ ํ•ด์‹œ(Hash)๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”!?

ํŒŒ์ด์ฌ์—์„œ๋Š” Dictionary ๋ผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ํ•ด์‹œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Dictionary๋Š” dictํด๋ž˜์Šค์— ๊ตฌํ˜„๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค!

 

ํ•ด์‹œ ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?!

ํ•ด์‹œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๋•Œ๋ฅผ ์†Œ๊ฐœํ•ด๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค : )

 

1. ๋ฆฌ์ŠคํŠธ๋ฅผ ์“ธ ์ˆ˜ ์—†์„ ๋•Œ 

๋ฆฌ์ŠคํŠธ๋Š” ์ˆซ์ž ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์›์†Œ์— ์ ‘๊ทผํ•˜๋Š”๋ฐ ์ฆ‰ list[1]์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ list['a']๋Š” ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ธ๋ฑ์Šค ๊ฐ’์„ ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฐ’ '๋ฌธ์ž์—ด, ํŠœํ”Œ'์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

 

2. ๋น ๋ฅธ ์ ‘๊ทผ  / ํƒ์ƒ‰์ด ํ•„์š”ํ•  ๋•Œ 

์•„๋ž˜์—์„œ ํ‘œ๋กœ ์ •๋ฆฌํ•ด ๋ณด์—ฌ๋“œ๋ฆด ์˜ˆ์ •์ด์ง€๋งŒ, ๋”•์…”๋„ˆ๋ฆฌ ํ•จ์ˆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๋Œ€๋ถ€๋ถ„ O(1)์ด๋ฏ€๋กœ ์•„์ฃผ ๋น ๋ฅธ ์ž๋ฃŒ๊ตฌ์กฐ ์ž…๋‹ˆ๋‹ค!

 

3. ์ง‘๊ณ„๊ฐ€ ํ•„์š”ํ•  ๋•Œ

์›์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ฌธ์ œ๋Š” ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ์—์„œ ๋งŽ์ด ์ถœ์ œ๋˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด๋•Œ ํ•ด์‹œ์™€, collections ๋ชจ๋“ˆ์˜ Counter ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„์ฃผ ๋น ๋ฅด๊ฒŒ ๋ฌธ์ œ๋ฅผ ํ‘ธ์‹ค ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋”•์…”๋„ˆ๋ฆฌ์™€ ๋ฆฌ์ŠคํŠธ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ ์ฐจ์ด

์•„๊นŒ ์œ„์—์„œ ๋”•์…”๋„ˆ๋ฆฌ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๋Œ€๋ถ€๋ถ„ O(1)์„ ๊ฐ–๋Š”๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ๋Š”๋ฐ ๋ฆฌ์ŠคํŠธ์™€ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋น„๊ตํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Operation Dictionary List
Get Item O(1) O(1)
Insert Item O(1) O(1) ~ O(N)
Update Item O(1) O(1)
Delete Item O(1) O(1) ~ O(N)
Search Item O(1) O(N)

List์— ๋น„ํ•ด Dictionary๊ฐ€ ๋งค์šฐ ๋น ๋ฅธ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰ , ์›์†Œ๋ฅผ ๋„ฃ๊ฑฐ๋‚˜ ์‚ญ์ œ, ์ฐพ๋Š” ์ผ์ด ๋งŽ์„ ๋•Œ์—๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค 

โ€ป ํŒŒ์ด์ฌ 3.7 ์ด์ƒ๋ถ€ํ„ฐ ๋”•์…”๋„ˆ๋ฆฌ๋Š” ์›์†Œ๊ฐ€ ๋“ค์–ด์˜จ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, 3.7 ๋ฏธ๋งŒ์€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ์—๋Š” ๋ฒ„์ „์— ์œ ์˜ํ•˜์„ธ์š”.

 

Dictionary ์‚ฌ์šฉ๋ฒ•

๐Ÿ“Œ Init

{}๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ dictํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ๋นˆ ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

key - value ์Œ์„ ๊ฐ–๋Š” dictionary ์„ ์–ธ๋„ ๋ฐ”๋กœ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

# ๋นˆ๋”•์…”๋„ˆ๋ฆฌ ์ƒ์„ฑ
dict1 = {} # {}
dict2 = dict() # {}
# ํŠน์ • key-value์Œ์„ ๊ฐ€์ง„ dictionary ์„ ์–ธ

Dog = {
    'name': '๋™๋™์ด',
    'weight': 4,
    'height': 100,
}


'''
{'height': 100, 'name': '๋™๋™์ด', 'weight': 4}
'''
# dictionary๋ฅผ value๋กœ ๊ฐ€์ง€๋Š” dictionary ์„ ์–ธ

Animals = {
    'Dog': {
        'name': '๋™๋™์ด',
        'age': '5'
    },
    'Cat': {
        'name': '์•ผ์˜น์ด',
        'weight': 3
    }
}


'''
 { 'Dog': { 'name': '๋™๋™์ด', 'age': '5'},
   'Cat': {'name': '์•ผ์˜น์ด','weight': 3 }}
'''

 

๐Ÿ“Œ Get

Dictionary์—์„œ ์›์†Œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•์€ ๋‘๊ฐ€์ง€ ์ž…๋‹ˆ๋‹ค.

1. [] ์‚ฌ์šฉํ•˜๊ธฐ

2. get ๋ฉ”์†Œ๋“œ ์ด์šฉํ•˜๊ธฐ

get ๋ฉ”์†Œ๋“œ๋Š” get(key,x) ๋กœ ์‚ฌ์šฉํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” '๋”•์…”๋„ˆ๋ฆฌ์— key๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, x๋ฅผ ๋ฆฌํ„ดํ•ด์ค˜๋ผ' ๋ผ๋Š” ์šฉ๋„์ž…๋‹ˆ๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ์นด์šดํ„ฐํ•˜๋Š” (์ง‘๊ณ„) ๊ฒฝ์šฐ์— getํ•จ์ˆ˜๊ฐ€ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

# [] ๊ธฐํ˜ธ ์‚ฌ์šฉํ•ด ์›์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ

dict = {'ํ•˜์ด': 300, 'ํ—ฌ๋กœ': 180, 3: 5}
dict['ํ—ฌ๋กœ'] # 180
# get ๋ฉ”์†Œ๋“œ๋ฅผ ์•„์šฉํ•ด ์›์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ 1
# ๋”•์…”๋„ˆ๋ฆฌ์— ํ•ด๋‹น key๊ฐ€ ์—†์„๋•Œ Key Error ๋ฅผ ๋‚ด๋Š” ๋Œ€์‹ , ํŠน์ •ํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

dict = {'ํ•˜์ด': 300, 'ํ—ฌ๋กœ': 180}
dict.get('๋™๋™', 0) # 0
# get ๋ฉ”์†Œ๋“œ๋ฅผ ์•„์šฉํ•ด ์›์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ 2
# ๋ฌผ๋ก , ๋”•์…”๋„ˆ๋ฆฌ์— ํ•ด๋‹น key๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋Œ€์‘ํ•˜๋Š” value๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

dict = {'ํ•˜์ด': 300, 'ํ—ฌ๋กœ': 180}
dict.get('ํ—ฌ๋กœ', 0) # 180

 

๐Ÿ“Œ Set

๋”•์…”๋„ˆ๋ฆฌ์— ๊ฐ’์„ ์ง‘์–ด๋„ฃ๊ฑฐ๋‚˜, ๊ฐ’์„ ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ [ ] ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# ๊ฐ’ ์ง‘์–ด๋„ฃ๊ธฐ

dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
dict['ํ™๊ธธ๋™'] = 100
dict #{'Anna': 180, '๊น€์ฒ ์ˆ˜': 300, 'ํ™๊ธธ๋™': 100}
# ๊ฐ’ ์ˆ˜์ •ํ•˜๊ธฐ1

dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
dict['๊น€์ฒ ์ˆ˜'] = 500
dict # {'Anna': 180, '๊น€์ฒ ์ˆ˜': 500}
# ๊ฐ’ ์ˆ˜์ •ํ•˜๊ธฐ2

dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
dict['๊น€์ฒ ์ˆ˜'] += 500
dict # {'Anna': 180, '๊น€์ฒ ์ˆ˜': 800}

 

๐Ÿ“Œ Delete

๋”•์…”๋„ˆ๋ฆฌ์—์„œ ํŠน์ • key๊ฐ’์„ ์ง€์šธ ๋•Œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

1. del dict_obj[key]

del์€ ํ‚ค์›Œ๋“œ๋กœ์จ, ๋งŒ์•ฝ ๋”•์…”๋„ˆ๋ฆฌ์— key๊ฐ€ ์—†๋‹ค๋ฉด keyError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

2. pop(key[,default])

pop์€ ๋ฉ”์†Œ๋“œ๋กœ์จ, pop๋ฉ”์†Œ๋“œ๋Š” key ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” value๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค. key๊ฐ€ ์—†๋‹ค๋ฉด ๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ default๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ default ์„ค์ •ํ•˜์ง€ ์•Š์•˜์„ ์‹œ์—” keyError๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

# del ์ด์šฉํ•˜๊ธฐ - ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ
dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
del dict['๊น€์ฒ ์ˆ˜']

dict #{'Anna': 180}
# del ์ด์šฉํ•˜๊ธฐ - ํ‚ค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ raise KeyError
my_dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
del my_dict['ํ™๊ธธ๋™'] 
'''
keyError ๋ฐœ์ƒ!
'''
# pop ์ด์šฉํ•˜๊ธฐ - ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋Œ€์‘ํ•˜๋Š” value ๋ฆฌํ„ด
my_dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
my_dict.pop('๊น€์ฒ ์ˆ˜', 180) # 300
# pop ์ด์šฉํ•˜๊ธฐ - ํ‚ค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋Œ€์‘ํ•˜๋Š” default ๋ฆฌํ„ด
my_dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
my_dict.pop('ํ™๊ธธ๋™', 180) # 180

 

๐Ÿ“Œ Iterate

๋”•์…”๋„ˆ๋ฆฌ๋ฅผ for๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์กฐํšŒํ•  ๋•Œ ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

1. key๋กœ๋งŒ ์ˆœํšŒํ•˜๊ธฐ

2. key, value ๋™์‹œ ์ˆœํšŒํ•˜๊ธฐ (items() ์‚ฌ์šฉ)

# key๋กœ๋งŒ ์ˆœํšŒ
dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
for key in dict:
    print(key)
    # ์ด ๊ฒฝ์šฐ value๋ฅผ ์ฐพ๊ณ  ์‹ถ์œผ๋ฉด dict[key] ์™€ ๊ฐ™์ด ์ ‘๊ทผ์„ ๋”ฐ๋กœ ํ•ด์ฃผ์–ด์•ผ.

'''
๊น€์ฒ ์ˆ˜
Anna
'''
# key-value ๋™์‹œ ์ˆœํšŒ

dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
for key, value in dict.items():
    print(key, value)

'''
๊น€์ฒ ์ˆ˜ 300
Anna 180
'''

 

๊ทธ ๋ฐ–์— ๋”•์…”๋„ˆ๋ฆฌ ์œ ์šฉํ•œ ํŒ

1. ํŠน์ • key๊ฐ€ ๋”•์…”๋„ˆ๋ฆฌ์— ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์กฐํšŒํ•  ๋•Œ - in ์‚ฌ์šฉํ•˜๊ธฐ

dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
print("๊น€์ฒ ์ˆ˜" in dict) #True
print("๊น€์ฒ ์ˆ˜" not in dict) # False

 

2. key ๋˜๋Š” value๋งŒ ๋ฝ‘์•„๋‚ด๋Š” ๋ฐฉ๋ฒ•

1. key ๋งŒ : keys()

# key๋ฅผ extract - keys ์‚ฌ์šฉ


my_dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
my_dict.keys() # dict_keys(['๊น€์ฒ ์ˆ˜', 'Anna'])

2. value๋งŒ : values()

# value๋ฅผ extract - values ์‚ฌ์šฉ


my_dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
my_dict.values() # dict_values([300, 180])

3. key - value ๋ชจ๋‘ : items()

# key, value ์Œ์„ extract - items ์‚ฌ์šฉ


my_dict = {'๊น€์ฒ ์ˆ˜': 300, 'Anna': 180}
my_dict.items() # dict_items([('๊น€์ฒ ์ˆ˜', 300), ('Anna', 180)])

 

 

์˜ค๋Š˜์€ ํŒŒ์ด์ฌ์—์„œ ํ•ด์‹œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋”•์…”๋„ˆ๋ฆฌ ๊ด€๋ จ ๋‚ด์šฉ์ด ๋” ๊ถ๊ธˆํ•˜์‹œ๋‹ค๋ฉด?! ์•„๋ž˜ ํฌ์ŠคํŒ…์„ ์ฝ์–ด์ฃผ์„ธ์š” : )

 

๋”•์…”๋„ˆ๋ฆฌ(Dictionary)

dic_name = {'์ด๋ฆ„':'์œ ๋‚˜','phone':'01012345678','birth':'20201228'} dic_wintable = {'๊ฐ€์œ„':'๋ณด','๋ฐ”์œ„':'๊ฐ€์œ„','๋ณด':'๋ฐ”์œ„'} ์ด์ฒ˜๋Ÿผ python์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ(Dictionary) ๋Š” ๊ฐ€์œ„๋ฐ”์œ„๋ณด ํ…Œ์ด๋ธ”..

yunaaaas.tistory.com

 

 

๋ฆฌ์ŠคํŠธ(List) / ๋”•์…”๋„ˆ๋ฆฌ(Dictionary) ์ •๋ ฌ

์ง€๋‚œ ๊ธ€์— ์ด์–ด ๋ฆฌ์ŠคํŠธ ์ •๋ ฌ์— ๊ด€ํ•ด ์ •๋ฆฌํ•ด๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค! ๋ฆฌ์ŠคํŠธ(list) ์ž๋ฃŒํ˜•๊ณผ ๋”•์…”๋„ˆ๋ฆฌ(dictionary) ์ž๋ฃŒํ˜•์— ๋Œ€ํ•ด ํ—ท๊ฐˆ๋ฆฌ์‹ ๋‹ค๋ฉด ?! ์•„๋ž˜ ๊ธ€์„ ์ฝ๊ณ  ์˜ค์‹œ๋ฉด ์ดํ•ดํ•˜์‹œ๊ธฐ ๋” ์‰ฌ์šฐ์‹ค ๊ฑฐ์˜ˆ์š” : ) ๋ฆฌ์Šค

yunaaaas.tistory.com

 

 

 

์ฐธ๊ณ 

 

TimeComplexity - Python Wiki

This page documents the time-complexity (aka "Big O" or "Big Oh") of various operations in current CPython. Other Python implementations (or older or still-under development versions of CPython) may have slightly different performance characteristics. Howe

wiki.python.org

 

๋ฐ˜์‘ํ˜•