๐Ÿฅ Python 06: ์ž๋ฃŒ ๊ตฌ์กฐ Advanced

yeeun leeยท2020๋…„ 4์›” 6์ผ
0

์ž๋ฃŒ ๊ตฌ์กฐ์˜ ๊ธฐ๋ณธ ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค๋ฉด, ์–ด๋–ค ์ƒํ™ฉ์—์„œ ์“ฐ์ด๋Š”์ง€์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ์ดํ•ดํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์ž๋ฃŒ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ์™ธ์— ์ž๋ฃŒ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ์•Œ๊ฒŒ ๋˜๋Š” ๋ถ€๋ถ„์„ ์š” ๊ฒŒ์‹œ๋ฌผ์— ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค ๐Ÿ”ฅ

0. ์ค‘์š”ํ•œ ์ด์œ 

"์ฝ”๋”ฉ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์ž๋ฃŒ๊ตฌ์กฐ, ์ด ๋‘๊ฐ€์ง€๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค" by. Linus Torvalds

์ž๋ฃŒ ๊ตฌ์กฐ๋ž€ ๋ฐ์ดํ„ฐ์˜ ํŽธ๋ฆฌํ•œ ์ ‘๊ทผ๊ณผ ์กฐ์ž‘์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์กฐ์งํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋ฌธ๋งฅ๊ณผ ๋ฐ์ดํ„ฐ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ „์ฒด ๊ฐœ๋ฐœ ์‹œ์Šคํ…œ์— ํฐ ์˜ํ–ฅ์„ ๋ผ์น˜๊ธฐ ๋•Œ๋ฌธ์—, ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์™€ ๊ฐ๊ฐ์˜ ์žฅ์ ๊ณผ ํ•œ๊ณ„๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ƒํ™ฉ์— ๋งž๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•˜๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

1. list

list ์™ธ์—๋„ array๋ผ๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๊ฐ€์žˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ๋ฉด์—์„œ๋Š” array๊ฐ€ ๋” ์œ ๋ฆฌํ•˜์ง€๋งŒ ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” list๊ฐ€ ํŽธํ•˜๋‹ค. array๋Š” ๋ชจ๋“ˆ์„ importํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

1.1 ํŠน์ง•

  • ์‚ฝ์ž… ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ๋œ๋‹ค, ์ฆ‰ ์ˆœ์ฐจ์  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์œ ์šฉํ•˜๋‹ค.
  • ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋™์ผํ•œ ๊ฐ’์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
  • index๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ์š”์†Œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์ค‘์ฐจ์› ๋ฐฐ์—ดMulti-dimentional Array์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
    - array์˜ ์š”์†Œ๊ฐ€ array๊ฐ€ ๋˜๋Š” ๊ฒƒ. ์ผ๋ฐ˜์ ์œผ๋กœ 2D array๊ฐ€ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
A = [[1,2,3], [11,12,13], [21,22,23]]
A[0][0] # output: 1 
A[1][2] # output: 12

1.2 ๋‹จ์ 

deleting is expensive

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

pre-allocation

์ž์ฃผ ๋Š˜์–ด๋‚  ํ™•๋ฅ ์ด ๋†’์€ ๋ฐ์ดํ„ฐ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค. pre-allocation์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด์ด ๋Š˜์–ด๋‚˜๋ฉด, ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฑฐ๊ธฐ์— ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— re-sizing์— ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค.

1.3 when to use

Array๋ฅผ ์ ์šฉ์‹œํ‚ค๋ฉด ์ข‹์€ ์˜ˆ๋กœ ์ฃผ์‹ ์ฐจํŠธ๊ฐ€ ์žˆ๋‹ค. ์ฃผ์‹ ์ฐจํŠธ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋Š”

  • ์š”์†Œ๊ฐ€ ์ค‘๊ฐ„์— ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜๋Š” ์ •๋ณด๊ฐ€ ์•„๋‹ˆ๋ฉฐ
  • ๋‚ ์งœ๋ณ„๋กœ ์ฃผ์‹ ๊ฐ€๊ฒฉ์ด ์ฐจ๋ก€๋Œ€๋กœ ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค.

์ฆ‰, ์ˆœ์„œ๊ฐ€ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ์ด๋ฏ€๋กœ Array ๊ฐ™์ด ์ˆœ์„œ๋ฅผ ๋ณด์กด ํ•ด์ฃผ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ด์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— Array๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์ฆ‰ ์ˆœ์„œ๊ฐ€ ์—†๋Š” ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‚ ์งœ๋ณ„ ์ฃผ์‹ ๊ฐ€๊ฒฉ์„ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฉฐ ๋งค๋ฒˆ ์ „์ฒด ์ž๋ฃŒ๋ฅผ ์ฝ์–ด ๋“ค์ด๊ณ  ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ๋ฐœ์ƒํ•œ๋‹ค.

2. tuple

list์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ’์„ ์ €์žฅํ•˜์ง€๋งŒ ํ•œ ๋ฒˆ ์ •์˜ํ•˜๊ณ  ๋‚˜๋ฉด ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.

2.1 ๋‹จ์ 

  • ๋”•์…”๋„ˆ๋ฆฌ, ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ์˜ ์˜๋ฏธ๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์—†๋‹ค.
  • ๋‹จ์  ๊ทน๋ณต์„ ์œ„ํ•ด Named tuple์ด๋ผ๋Š” ๊ฒƒ๋„ ์กด์žฌํ•œ๋‹ค.

2.2 when to use

  • 2-3๊ฐœ ์ •๋„์˜ ์†Œ๊ทœ๋ชจ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ
  • ํ•จ์ˆ˜์—์„œ ๋ฆฌํ„ด ๊ฐ’์„ ํ•œ ๊ฐœ ์ด์ƒ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ถ์„ ๋•Œ
  • ๊ฐ„๋‹จํ•œ ๊ฐ’์„ ๋นจ๋ฆฌ ๋ฆฌํ„ดํ•˜๊ณ  ์‹ถ์„ ๋•Œ ex. ์ง€๋„ ์ขŒํ‘œ
# Tuple์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ
[(1,2), (2,4)] # Array(List) ์•ˆ์˜ Tuple

# Tuple์„ ์•ˆ ์“ฐ๋Š” ๊ฒฝ์šฐ์—๋Š” class๋ฅผ ์ƒ์„ฑํ•ด์•ผํ•จ
class cord:
	def __init__(self, x, y):
		self.x = x
		self.y = y

3. set

set๋Š” array๋‚˜ list์ฒ˜๋Ÿผ ์ˆœ์—ด ์ž๋ฃŒ๊ตฌ์กฐ(collection)์ด๋‹ค. ํ•˜์ง€๋งŒ ์ˆœ์„œ๋ผ๋Š” ๊ฐœ๋…์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • unordered collection: ๋ฐ์ดํ„ฐ๋ฅผ ๋น„์ˆœ์ฐจ์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ˆœ์—ด ์ž๋ฃŒ๊ตฌ์กฐ. ์‚ฝ์ž… ์‹œ(insertion)์—๋„ ์ˆœ์„œ๋Œ€๋กœ ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • iterable: iteration์— ์“ธ ์ˆ˜ ์žˆ๋‹ค.
  • mutable: ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋‹ค.
  • has no duplicated elements: ๋™์ผํ•œ ๊ฐ’์„ ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฝ์ž… ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋™์ผํ•œ ๊ฐ’์ด ์—ฌ๋Ÿฌ๋ฒˆ ์‚ฝ์ž… ๋˜๋ฉด ํ•˜๋‚˜์˜ ๊ฐ’๋งŒ ์ €์žฅ๋œ๋‹ค.
  • Fast Lookup์ด ํ•„์š”ํ• ๋•Œ ์ฃผ๋กœ ์“ฐ์ธ๋‹ค.

look up

ํŠน์ • ๊ฐ’์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธ ํ•˜๋Š”๊ฒƒ์— ์œ ์šฉํ•˜๋‹ค. hash table์ด๋ผ๊ณ  ์•Œ๋ ค์ง„ ์ž๋ฃŒ ๊ตฌ์กฐ ๋•๋ถ„์— ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„์ดใ…ใ„ท.
e.g. 5 in my_set

3.1 set์˜ ๊ตฌ์กฐ

set๊ฐ€ ์ €์žฅ๋  ๋•Œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ €์žฅ๋œ๋‹ค.

  1. ์ €์žฅํ•  ์š”์†Œ์˜ ๊ฐ’์˜ hash ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.
  2. ํ•ด์‰ฌ๊ฐ’์— ํ•ด๋‹นํ•˜๋Š” ๊ณต๊ฐ„(bucket)์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

3.2 when to use

  • ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ณจ๋ผ๋‚ด์•ผ ํ• ๋•Œ
  • ๋น ๋ฅธ look up ์„ ํ•ด์•ผ ํ• ๋•Œ
  • ๊ทธ๋Ÿฌ๋ฉด์„œ ์ˆœ์„œ๋Š” ์ƒ๊ด€ ์—†์„๋•Œ

- union

๋‘ ๊ฐœ์˜ set์—์„œ ํ•ฉ์ง‘ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•. union ํ•จ์ˆ˜๋‚˜ | operator๋ฅผ ํ†ตํ•ด ๋‘ ๊ฐœ์˜ set๋ฅผ ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค. ๋‘ hash table values๋Š” ์š”์†Œ๋ฅผ ํ•ฉ์ณ์ฃผ๊ณ , ์ค‘๋ณต๋œ ์•„์ดํ…œ์€ ์‚ญ์ œ์‹œํ‚จ๋‹ค.

people = {"Jay", "Idrish", "Archil"} 
vampires = {"Karan", "Arjun"} 
dracula = {"Deepanshu", "Raju"} 

get_union1 = people.union(vampires)
# output : {'Idrish', 'Archil', 'Jay', 'Karan', 'Arjun'}

get_union_2 = people | dracula
# output : {'Idrish', 'Archil', 'Deepanshu', 'Raju', 'Jay'}

- intersection

๋‘ ๊ฐœ์˜ ์„ธํŠธ์—์„œ ๊ต์ง‘ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•. intersection ํ•จ์ˆ˜๋‚˜ & operator๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

set1 = { 1,2,3,4,5 }
set2 = {3,4,5,6,7,8,9}

set3 = set1.intersection(set2)
set3 = set1 & set2 

# output : {3,4,5} 

- difference

๋‘ ๊ฐœ์˜ ์„ธํŠธ์—์„œ ์ฐจ์ง‘ํ•ฉ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•. difference ํ•จ์ˆ˜๋‚˜ - operator๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

set1 = { 1,2,3,4,5 }
set2 = {3,4,5,6,7,8,9}

set3 = set1.difference(set2)

set1-set2 # output : {1, 2}
set2-set1 # output : {8, 9, 6, 7}

clear

set ๋‚ด์— ์žˆ๋Š” element๋ฅผ ์ง€์›Œ์ฃผ๋Š” ๊ธฐ๋Šฅ

set3 = {3, 4, 5}
set3.clear() # output : set()

3.3 frozen set

immutableํ•œ ๊ฐ์ฒด. set๋Š” ์–ธ์ œ๋“  ๋ฐ”๋€” ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด, frozen set์€ ๋งŒ๋“ค์–ด์ง„ ๋’ค์— ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

frozen_set = frozenset(['a','b', 'c'])
frozen_set.add('h')

# File "<stdin>", line 1, in <module>
# AttributeError: 'frozenset' object has no attribute 'add'

3.4 ๋‹จ์ 

์œ„์—์„œ ๋งํ–ˆ๋“ฏ ์ˆœ์„œ๊ฐ€ ์—†๊ณ , immutable type์˜ instance๋งŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • The set doesnโ€™t maintain elements in any particular order.
  • Only instances of immutable types can be added to a Python set.

4. Hash

๋‹จ๋ฐฉํ–ฅ (one way) ์•”ํ˜ธํ™”. ๋‹จ๋ฐฉํ–ฅ์ด๋ž€ ํ•œ๋ฒˆ ์•”ํ˜ธํ™” ํ•˜๋ฉด ๋ณตํ˜ธํ™”๊ฐ€ ์•ˆ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค. ์‹ค์ œ ๊ฐ’์˜ ๊ธธ์ด์™€ ์ƒ๊ด€์—†์ด hash ๊ฐ’์€ ์ผ์ •ํ•œ ๊ธธ์ด๋ฅผ ๊ฐ€์ง„๋‹ค. ๊ทธ๋ž˜์„œ Hash๋Š” ์ฃผ๋กœ ์ž„์˜์˜ ๊ธธ์ด๋ฅผ ๊ฐ–๋Š” ์ž„์˜์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๊ณ ์ •๋œ ๊ธธ์ด์˜ ๋ฐ์ดํ„ฐ๋กœ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

SHA ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ํ•ด์‹œ๊ฐ’์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

import hashlib

def sha1_hash(input_str):
    
    hash_obj = hashlib.sha1(input_str.encode())
    hash_value = hash_obj.hexdigest()
    return hash_value


wecode_hash_value = sha1_hash('wecode')
print(wecode_hash_value)
# output : 283463014a3f8ab829fcf9087ff85d50da1d1bb6
print(len(wecode_hash_value))
# output : 40

hash_value_1234 = sha1_hash('1234')
print(hash_value_1234)
# output: 7110eda4d09e062aa5e4a390b0a572ac0d2c0220
print(len(hash_value_1234))
# output: 40

5. dictionary

Dictionary (๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” hashmap ์ด๋‚˜ hash table์ด๋ผ๊ณ  ํ•˜๊ธฐ๋„ ํ•œ๋‹ค)๋Š” Key-value ํ˜•ํƒœ์˜ ๊ฐ’์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค.

  • Set๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŠน์ • ์ˆœ์„œ๋Œ€๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • Key์˜ ๊ฐ’์€ ์ค‘๋ณต๋  ์ˆ˜ ์—†๋‹ค. ๋งŒ์ผ ์ค‘๋ณต๋œ key ๊ฐ€ ์žˆ์œผ๋ฉด ๋จผ์ € ์žˆ๋˜ key์™€ value๋ฅผ ๋Œ€์ฒดํ•œ๋‹ค.
  • ์ˆ˜์ • ๊ฐ€๋Šฅํ•˜๋‹ค(mutable)

profile
์ด์‚ฌ๊ฐ„ ๋ธ”๋กœ๊ทธ: yenilee.github.io

0๊ฐœ์˜ ๋Œ“๊ธ€