๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Skill Up๐Ÿ”ฅ/Python

defaultdict ์ •๋ฆฌ

by ๊ธฐ๋ฉฐ๋ˆ… 2022. 5. 3.

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ด€๋ จ ๋ฌธ์ œ๋ฅผ ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ ๋‹ค๋ฅธ๋ถ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒŒ๋˜์—ˆ๊ณ  defaultdict๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ๊ถ๊ธˆํ•˜์—ฌ ๊ณต๋ถ€๋ฅผ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


python์˜ collections ๋ชจ๋“ˆ์—๋Š” defaultdict๋ผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค.

defaultdict๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ๊ธฐ๋ณธ๊ฐ’์„ ์ง€์ •ํ•œ ๋”•์…”๋„ˆ๋ฆฌ์ธ๋ฐ ๊ธฐ๋ณธ ๋”•์…”๋„ˆ๋ฆฌ์™€ ์–ด๋– ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ์•„๋ณด์ž.

 

defaultdict()๋Š” ๋”•์…”๋„ˆ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” dictํด๋ž˜์Šค์˜ ์„œ๋ธŒํด๋ž˜์Šค์ด๋‹ค. 

์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์€ ๊ธฐ๋ณธ ๋”•์…”๋„ˆ๋ฆฌ์™€ ๊ฑฐ์˜ ๋™์ผํ•œ๋ฐ defaultdict()๋Š” ์ธ์ž๋กœ ์ฃผ์–ด์ง„ ๊ฐ์ฒด(default-factory)์˜ ๊ธฐ๋ณธ๊ฐ’์„ ๋”•์…”๋„ˆ๋ฆฌ๊ฐ’์˜ ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

-> ์ด๊ฒŒ ๋ฌด์Šจ๋ง์ด๋ƒ๋ฉด ์ผ๋ฐ˜์ ์ธ ๋”•์…”๋„ˆ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฏธ๋ฆฌ ์‚ฝ์ž…ํ•˜์ง€ ์•Š์€ key๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

>>> n_dict = dict()
>>> n_dict["a"]

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'a'

“a” ๋ผ๋Š” ํ‚ค์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค€์ ์ด ์—†๊ธฐ๋•Œ๋ฌธ์—, ๋‹น์—ฐํžˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด์— setdefault๋ฅผ ์‚ฌ์šฉํ•ด ํ˜ธ์ถœ๊ณผ ๋™์‹œ์— ์„ ์–ธ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

>>> n_dict = dict()
>>> n_dict.setdefault("a", 0)
0
>>> n_dict
{'a': 0}

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ทธ๋‹ค์ง€ ํšจ์œจ์ ์ด์ง€ ์•Š๋‹ค.

 

 

์ด๋•Œ defaultdict๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

defaultdict๋ฅผ ํ™œ์šฉํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ๊ฐ’์„ ‘int’ ๋กœ ์„ ์–ธํ•ด์ฃผ๊ณ , ๊ธฐ์กด์— ์—†๋˜ key๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๋‹น key๊ฐ€ 0์œผ๋กœ ์ž๋™ ์ดˆ๊ธฐํ™”๋œ๋‹ค.

-> ๊ธฐ๋ณธ๊ฐ’์„ int๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฆฌ์ŠคํŠธ, set(์ง‘ํ•ฉ) ๋“ฑ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

>>> from collections import defaultdict
>>> d_dict = defaultdict(int)
>>> d_dict["a"]
0
>>> d_dict
defaultdict(<class 'int'>, {'a': 0})

 

default๊ฐ’์œผ๋กœ list๋ฅผ ์ฃผ์—ˆ์„๋•Œ  >>> list_dict = defaultdict(list) - ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด  []๋กœ ์ดˆ๊ธฐํ™”

default๊ฐ’์œผ๋กœ set์„ ์ฃผ์—ˆ์„๋•Œ >>> list_dict = defaultdict(set) - ๊ฐ’์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด set()์œผ๋กœ ์ดˆ๊ธฐํ™”

 

 

defaultdict๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” import๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

>>> from collections import defaultdict

 

 

์ด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฏธ๋ฆฌ ์„ ์–ธํ•˜์ง€ ์•Š์€ key์— ๊ฐ’์„ ๋”ํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

>>> d_dict = defaultdict(int)
>>> d_dict["a"] += 10
10
>>> d_dict
defaultdict(<class 'int'>, {'a': 10})

lambda ์‹์„ ์‚ฌ์šฉํ•ด ์›ํ•˜๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ์ง€์ •ํ• ์ˆ˜๋„ ์žˆ๋‹ค.

>>> d_dict = defaultdict(lambda: 'default value')
>>> d_dict["a"]
'default value'

 

https://itholic.github.io/python-defaultdict/

ํ•ด๋‹น ๋‚ด์šฉ์€ ์œ„์˜ ์‚ฌ์ดํŠธ๋ฅผ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.