반응형

딕셔너리란?


key, value로 이루어진 자료구조이고, C++, Java에서 Map과 같은 역할을 한다.


딕셔너리에 대한 메소드는 이 게시물에서 다루지 않고, 가장 간단한 딕셔너리 이용 방법에 대해 이야기 하고자 한다.



예제


바로 예제를 통해 알아보자.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#-*- coding: CP949 -*-
 
# 기본적 dict 이용 방법
 
= {} # dict 자료구조 선언1
print type(d)
 
= {'1':'a''2':'b''3':'c'}
print d
 
print d['1']
#print d['4'] # 존재하지 않기에 에러
 
 
 
# 특정 문자열이 있을 때 단어의 개수를 count하는 코드
 
word = 'hello world i m python!'
= dict() # dict 자료구조 선언2
 
for ch in word:
    if ch not in d: # d에 ch가 존재하지 않을 때
        d[ch] = 1
    else# 이미 존재 할 때
        d[ch] += 1
 
print d
 
for i, j in d.items():
    print 'key :', i, ' cnt :', j
 
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


위의 두가지 코드중 첫번째는 기본적으로 dictionary를 생성하여 어떤 값이 존재하는지 바로 참조할 수 있는 방식을 보여준다.


리스트는 인덱스를 통해 참조하지만 dictionary는 key를 통해 value를 참조한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#-*- coding: CP949 -*-
 
# 특정 문자열이 있을 때 단어의 개수를 count하는 코드
 
word = 'hello world i m python!'
= dict() # dict 자료구조 선언2
 
for ch in word:
    d[ch] = d.get(ch, 0+ 1
    
print d
 
for i, j in d.items():
    print 'key :', i, ' cnt :', j
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


위의 코드는 이전 코드와 같지만, get이라는 메서드를 이용하여 단어의 개수를 count한다.


get(key, default)의 의미는 key가 d에 존재하면 그에 해당하는 value를 가져오고 존재하지 않으면 0이라는 값으로 초기화해준다.


따라서 처음 h가 들어왔을 때 d['h']는 없으므로 0으로 초기화 되고 거기에 +1이되어 1이 된다.


mbox-short.txt


위의 파일은 파이썬 홈페이지에서 제공하는 mbox-short.txt라는 텍스트 파일이다.


여기서 From으로 시작하는 문자열에 존재하는 domain의 모든 수를 count 하는 프로그램은 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#-*- coding: CP949 -*-
 
try:
    rhandle = open(raw_input('Enter file name: '),'r')
 
except:
    print 'Can\'t open file'
 
dic = {}
 
for i in rhandle:
    if i.startswith('From'and not i.startswith('From:'):
        tmp = i.split()
        mail = tmp[1]
        domain = mail.split('@')[1]
        
        dic[domain] = dic.get(domain, 0+ 1
 
print dic
 
rhandle.close()
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


파일내에 문자열 자체가 From과 From:이 있기에

From에 해당하는 것만 추출 한 후,  split()를 해주면 mail의 1번 인덱스에 메일이 존재하게 된다.

이때 mail을 '@'을 기준으로 또 split해주면 mail은 [id,domin]으로 스플릿되어있다.


따라서 domain은 스플릿된 1번 인덱스를 받아 다음과 같이 dic[domain] = dic.get(domain, 0) + 1을 해주면 된다.


dictionary 자료구조를 익히기 위해서는 http://www.crocus.co.kr/605 다음 링크로 들어가 이 문제를 python으로 해결해보자.














반응형