' j a n ' : 1 , ' f e b ' : 2 , ' m a r ' : 3 } > > > p r i n t d [ ' j a n ' ] , d [ ' f e b ' ] , d [ ' m a r ' ] 1 2 3 " 사전 " 자료 구조 키 (key) 와 값 (value) 사이의 관계를 저장한다 6 / 73
{ ' j a n ' : 1 , ' f e b ' : 2 , ' m a r ' : 3 , . . . } { ' a p r ' : 4 , ' a u g ' : 8 , ' d e c ' : 1 2 , ' f e b ' : 2 , . . } # d i c t ( ) 의 키워드 인자 > > > d i c t ( j a n = 1 , f e b = 2 , m a r = 3 , a p r = 4 , . . ) { ' a p r ' : 4 , ' a u g ' : 8 , ' d e c ' : 1 2 , ' f e b ' : 2 , . . } # ( k e y , v a l u e ) 쌍의 목록으로 만들기 > > > m o n t h _ n a m e s = [ ( ' j a n ' , 1 ) , ( ' f e b ' , 2 ) , ( ' m a r ' , 3 ) , ( ' a p r ' , 4 ) , ( ' m a y ' , 5 ) , ( ' j u n ' , 6 ) , . . ] > > > d i c t ( m o n t h _ n a m e s ) { ' a p r ' : 4 , ' a u g ' : 8 , ' d e c ' : 1 2 , ' f e b ' : 2 , . . } 7 / 73
n a m e . t i t l e ( ) : n u m f o r n a m e , n u m i n m o n t h _ n a m e s } { ' M a r ' : 3 , ' F e b ' : 2 , ' A u g ' : 8 , ' S e p ' : 9 , . . } # 짝수 달만 고르기 > > > { n a m e : n u m f o r n a m e , n u m i n m o n t h _ n a m e s i f n u m % 2 = = 0 } { ' f e b ' : 2 , ' a u g ' : 8 , ' a p r ' : 4 , ' j u n ' : 6 , . . } # d i c t 뒤집기 > > > m o n t h s = d i c t ( m o n t h _ n a m e s ) > > > { v : k f o r k , v i n m o n t h s . i t e m s ( ) } { 1 : ' j a n ' , 2 : ' f e b ' , 3 : ' m a r ' , 4 : ' a p r ' , . . } 8 / 73
= { ' j a n ' : 1 , ' f e b ' : 2 , ' m a r ' : 3 , ' a p r ' : 4 , . . } > > > m o n t h s [ ' j a n ' ] 1 > > > m o n t h s [ ' J a n ' ] K e y E r r o r : J a n > > > ' J a n ' i n m o n t h s F a l s e 9 / 73
h s . g e t ( ' J a n ' ) N o n e > > > m o n t h s . g e t ( ' J a n ' , 1 ) 1 > > > m o n t h s [ ' J a n ' ] K e y E r r o r : J a n > > > m o n t h s . s e t d e f a u l t ( ' J a n ' , 1 ) 1 > > > m o n t h s [ ' J a n ' ] 1 10 / 73
r d s = o p e n ( ' / u s r / s h a r e / d i c t / w o r d s ' ) . r e a d ( ) . s p l i t l i n e s ( ) > > > w o r d s [ ' A ' , ' a ' , ' a a ' , ' a a l ' , ' a a l i i ' , ' a a m ' , ' A a n i ' , ' a a r d v a r k ' , . . ] 목표 : 단어 길이의 분포를 구해 보자 길이 1 인 단어 : 52 개 길이 2 인 단어 : 160 개 길이 3 인 단어 : 1420 개 .. 11 / 73
n g t h _ c o u n t = { } > > > f o r l i n m a p ( l e n , w o r d s ) : i f l i n l e n g t h _ c o u n t : l e n g t h _ c o u n t [ l ] + = 1 e l s e : l e n g t h _ c o u n t [ l ] = 1 12 / 73
n g t h _ c o u n t = { } > > > f o r l i n m a p ( l e n , w o r d s ) : l e n g t h _ c o u n t [ l ] = l e n g t h _ c o u n t . g e t ( l , 0 ) + 1 13 / 73
> > > b y _ l e n = { } > > > f o r w i n w o r d s : b y _ l e n . g e t ( l e n ( w ) , [ ] ) . a p p e n d ( w ) > > > b y _ l e n { } # . . . 어? 14 / 73
> > b y _ l e n = { } > > > f o r w i n w o r d s : b y _ l e n . s e t d e f a u l t ( l e n ( w ) , [ ] ) . a p p e n d ( w ) > > > b y _ l e n { 1 : [ ' A ' , ' a ' , ' B ' , ' b ' , ' C ' , . . . ] , 2 : [ ' a a ' , ' A b ' , ' a d ' , ' a e ' , ' A h ' , . . . ] , 3 : [ ' a a l ' , ' a a m ' , ' a b a ' , ' a b b ' , ' A b e ' , . . ] , . . } 15 / 73
. k e y s ( ) [ ' m a r ' , ' f e b ' , ' a u g ' , ' s e p ' , . . ] > > > [ m o n t h f o r m o n t h i n m o n t h s ] [ ' m a r ' , ' f e b ' , ' a u g ' , ' s e p ' , . . ] > > > m o n t h s . v a l u e s ( ) [ 3 , 2 , 8 , 9 , . . ] > > > m o n t h s . i t e m s ( ) [ ( ' m a r ' , 3 ) , ( ' f e b ' , 2 ) , ( ' a u g ' , 8 ) , ( ' s e p ' , 9 ) , . . ] 순서는 엉망진창 ! i t e r k e y s ( ) , i t e r v a l u e s ( ) , i t e r i t e m s ( ) 17 / 73
h a s h ( ' j a n ' ) - 8 6 8 1 4 1 9 8 8 3 2 2 4 6 2 2 0 3 2 > > > h a s h ( ' f e b ' ) - 4 1 7 7 1 9 7 8 3 3 2 0 1 1 9 0 6 2 0 > > > h a s h ( f l o a t ) - 9 2 2 3 3 7 2 0 3 6 5 7 4 9 6 1 4 2 0 > > > h a s h ( _ _ b u i l t i n s _ _ ) - 9 2 2 3 3 7 2 0 3 6 5 7 4 9 2 6 4 1 6 32 / 73
> > a = { ' j a n ' : 1 , ' a p r ' : 4 } > > > b = { ' a p r ' : 4 , ' j a n ' : 1 } > > > p r i n t a , b { ' j a n ' : 1 , ' a p r ' : 4 } { ' a p r ' : 4 , ' j a n ' : 1 } > > > p r i n t a = = b T r u e > > > p r i n t a . i t e m s ( ) = = b . i t e m s ( ) F a l s e 46 / 73
h e l l o ' , 1 : ' w o r l d ' } b = { 8 : ' h e l l o ' , 1 : ' w o r l d ' } # 키 몇 개를 주르르 추가: 리사이징이 일어난다! f o r i i n x r a n g e ( 5 ) : b [ i + 1 0 0 ] = 1 # 지워도 이미 늘어난 배열은 아직 줄어들지 않았다 f o r i i n x r a n g e ( 5 ) : d e l b [ i + 1 0 0 ] p r i n t a = = b # T r u e p r i n t a . i t e m s ( ) = = b . i t e m s ( ) # F a l s e ! 50 / 73
s = { ' j a n ' : 1 , ' f e b ' : 2 , ' m a r ' : 3 , ' a p r ' : 4 , . . } f o r k , v i n m o n t h s . i t e r i t e m s ( ) : i f v > = 6 : d e l m o n t h s [ k ] p r i n t m o n t h s R u n t i m e E r r o r : d i c t i o n a r y c h a n g e d s i z e d u r i n g i t e r a t i o n 53 / 73
s = { ' j a n ' : 1 , ' f e b ' : 2 , ' m a r ' : 3 , ' a p r ' : 4 , . . } f o r k , v i n m o n t h s . i t e m s ( ) : i f v > = 6 : d e l m o n t h s [ k ] p r i n t m o n t h s { ' m a r ' : 3 , ' m a y ' : 5 , ' f e b ' : 2 , ' j a n ' : 1 , ' a p r ' : 4 } 54 / 73
s e r ( o b j e c t ) : d e f _ _ i n i t _ _ ( s e l f , n a m e , e m a i l ) : s e l f . n a m e = n a m e s e l f . e m a i l = e m a i l > > > j o n g m a n = U s e r ( ' j o n g m a n ' , ' j o n g m a n @ g m a i l . c o m ' ) > > > r a t i n g = { j o n g m a n : ' g o o d ' } > > > p r i n t r a t i n g [ j o n g m a n ] g o o d 오 .. 잘 된다 ! 55 / 73
j o n g m a n 2 = U s e r ( ' j o n g m a n ' , ' j o n g m a n @ g m a i l . c o m ' ) > > > p r i n t r a t i n g [ j o n g m a n 2 ] K e y E r r o r : < _ _ m a i n _ _ . U s e r o b j e c t a t 0 x 1 0 5 e 1 c 9 1 0 > 기본적으로는 모든 인스턴스를 다른 키로 인식 ! 해시에 사용할 수 있도록 추가 구현이 필요 56 / 73
s e r ( o b j e c t ) : . . d e f m e m b e r s ( s e l f ) : r e t u r n ( s e l f . n a m e , s e l f . e m a i l ) d e f _ _ e q _ _ ( s e l f , o t h e r ) : r e t u r n s e l f . m e m b e r s ( ) = = o t h e r . m e m b e r s ( ) d e f _ _ h a s h _ _ ( s e l f ) : r e t u r n h a s h ( s e l f . m e m b e r s ( ) ) 58 / 73
r o m c o l l e c t i o n s i m p o r t O r d e r e d D i c t > > > d = O r d e r e d D i c t ( ) > > > d [ ' g i r l s ' ] = 1 > > > d [ ' g e n e r a t i o n ' ] = 2 > > > d [ ' g g g g ' ] = 3 > > > d [ ' b a b y b a b y ' ] = 4 > > > d . i t e m s ( ) [ ( ' g i r l s ' , 1 ) , ( ' g e n e r a t i o n ' , 2 ) , ( ' g g g g ' , 3 ) , ( ' b a b y b a b y ' , 4 ) ] 62 / 73
있겠지? 히히 > > > d = O r d e r e d D i c t ( g i r l s = 1 , g e n e r a t i o n = 2 , g g g g = 3 , b a b y b a b y = 4 ) # 이런. . > > > d . i t e m s ( ) [ ( ' b a b y b a b y ' , 4 ) , ( ' g g g g ' , 3 ) , ( ' g e n e r a t i o n ' , 2 ) , ( ' g i r l s ' , 1 ) ] 63 / 73
l l e c t i o n s i m p o r t d e f a u l t d i c t > > > b y _ l e n = d e f a u l t d i c t ( l a m b d a : [ ] ) > > > f o r w i n w o r d s : b y _ l e n [ l e n ( w ) ] . a p p e n d ( w ) > > > b y _ l e n { 1 : [ ' A ' , ' a ' , ' B ' , ' b ' , ' C ' , . . . ] , 2 : [ ' a a ' , ' A b ' , ' a d ' , ' a e ' , ' A h ' , . . . ] , . . } s e t d e f a u l t 하는 것과 같은 효과 기본값이 아니라 기본값을 반환하는 함수 ! 64 / 73
l l e c t i o n s i m p o r t d e f a u l t d i c t > > > b y _ l e n = d e f a u l t d i c t ( l i s t ) > > > f o r w i n w o r d s : b y _ l e n [ l e n ( w ) ] . a p p e n d ( w ) > > > b y _ l e n { 1 : [ ' A ' , ' a ' , ' B ' , ' b ' , ' C ' , . . . ] , 2 : [ ' a a ' , ' A b ' , ' a d ' , ' a e ' , ' A h ' , . . . ] , . . } 대부분 타입명도 함수 (callable) 65 / 73
[ 4 ] [ ' h ' ] = [ ' h a a b ' , ' h a a f ' , ' h a b u ' , ' h a c k ' , . . ] A [ 5 ] [ ' h ' ] = [ ' h a b i t ' , ' h a c h e ' , ' h a c k y ' , ' h a d d o ' , . . ] A = d e f a u l t d i c t ( l a m b d a : d e f a u l t d i c t ( l i s t ) ) f o r w i n w o r d s : A [ l e n ( w ) ] [ w [ 0 ] ] . a p p e n d ( w ) 66 / 73
i t e _ d i c t = l a m b d a : d e f a u l t d i c t ( i n f i n i t e _ d i c t ) > > > i n f = i n f i n i t e _ d i c t ( ) > > > i n f [ ' U s e r s ' ] [ 0 ] [ ' u s e r n a m e ' ] = ' j o n g m a n ' > > > i n f [ ' U s e r s ' ] [ 0 ] [ ' e m a i l ' ] = ' j o n g m a n @ g m a i l . c o m ' > > > i n f . i t e m s ( ) [ ( ' U s e r s ' , d e f a u l t d i c t ( < f u n c t i o n < l a m b d a > a t 0 x 1 0 2 5 d 0 9 3 8 > , { 0 : d e f a u l t d i c t ( < f u n c t i o n < l a m b d a > a t 0 x 1 0 2 5 d 0 9 3 8 > , { ' u s e r n a m e ' : ' j o n g m a n ' , ' e m a i l ' : ' j o n g m a n @ g m a i l . c o m ' } ) } ) ) ] 67 / 73
l l e c t i o n s i m p o r t C o u n t e r > > > l e n g t h _ c o u n t = C o u n t e r ( m a p ( l e n , w o r d s ) ) # d i c t 처럼 원소에 접근 > > > p r i n t l e n g t h _ c o u n t [ 1 ] , l e n g t h _ c o u n t [ 2 ] , l e n g t h _ c o u n t [ 3 ] 5 2 1 6 0 1 4 2 0 # 없는 키는 0 을 반환 > > > p r i n t l e n g t h _ c o u n t [ 1 2 3 7 8 1 2 ] 0 # 가장 흔한 길이 > > > p r i n t l e n g t h _ c o u n t . m o s t _ c o m m o n ( 3 ) [ ( 9 , 3 2 4 0 3 ) , ( 1 0 , 3 0 8 7 8 ) , ( 8 , 2 9 9 8 9 ) ] 68 / 73
e i m p o r t o p e n s h e l f = o p e n ( ' t e s t ' ) # t e s t . d b 에 사전 내용을 기록 s h e l f [ ' h e l l o ' ] = 1 s h e l f [ ' w o r l d ' ] = 2 s h e l f . c l o s e ( ) s h e l f = o p e n ( ' t e s t ' ) # 이미 있는 t e s t . d b 를 읽어옴 p r i n t s h e l f . i t e m s ( ) [ ( ' h e l l o ' , 1 ) , ( ' w o r l d ' , 2 ) ] 69 / 73
( ) 를 빼먹으면 저장이 안됨 context manager! f r o m s h e l v e i m p o r t o p e n f r o m c o n t e x t l i b i m p o r t c l o s i n g w i t h c l o s i n g ( o p e n ( ' a . s h e l f ' ) ) a s s h e l f : s h e l f [ ' h e l l o ' ] = 1 s h e l f [ ' w o r l d ' ] = 2 70 / 73