본문 바로가기

Language/Python

<파이썬 기초> 10. 딕셔너리

이 글은 미시건 주립대학교 찰스 교수의 MOOC강의인 Python for Everybody를 수강하고 정리하며 쓰는 글입니다.

 

 

 파이썬에는 앞서 배웠던 리스트와 비슷하게 딕셔너리가 존재한다. 차이점이라면 순서가 따로 없지만 키(Key)가 존재한다는 것이다. 키의 존재로 파이썬이 엄청난 강점을 갖게 된다. 키가 존재함으로써 값을 찾아낼 때 더 빠르고 더 적은용량으로 가능하게 한다고 한다.

 

X = dict()
X['AA'] = 10
X['BB'] = 30
X['CC'] = 70
print(X)
print(X['AA'])
X['BB'] = X['BB'] + 5
print(X)

# {'AA': 10, 'BB': 30, 'CC': 70}
# 10
# {'AA': 10, 'BB': 35, 'CC': 70}

 

  먼저 dict함수를 통해 딕셔너리를 만들어 주었다. 참고로 ={}를 통해서도 생성가능하다. 그 후 'AA'라는 키에는 10을 할당하고 'BB'라는 키에는 30을, 'CC'라는 키에는 70을 할당해주고 출력하였다. 그러면 첫 출력값과 같이 키:값 의 형태로 딕셔녀리가 만들어진다. 

 

 딕셔너리는 앞서 설명한대로 키를 인덱스처럼 활용하여 값을 불러올 수 있다. 또 + 연산자를 통해 값을 변경하는 것도 가능하다.

 

 이를 통해 빈도 수를 측정하는 프로그램을 만들어보자.

 

counts = dict()
names = ['harry', 'iu', 'harry', 'suzy', 'iu']
for name in names :
    if name not in counts :
        counts[name] = 1
    else :
        counts[name] = counts[name] + 1
print(counts)

# {'harry': 2, 'iu': 2, 'suzy': 1}

 

 먼저 값에 빈도 수를 나타내는 딕셔너리를 만들기위해 딕셔너리를 생성하였다. 그리고 names에는 이름들이 리스트의 형태로 할당되어있다. for 문을 통해 딕셔너리에 이름이 없으면 키에 1을 넣어주었고, 이름이 있다면 키에 1을 더하게 함으로써 빈도수를 측정하게 하였다. 결과적으로 harry는 2, iu도 2, suzy는 1이라는 값을 정상적으로 출력했다.

 

 하지만 우리는 간결한 코드를 짜야하는데 여기서는 get메소드를 통해 그것이 가능하다.

 

counts = dict()
names = ['harry', 'iu', 'harry', 'suzy', 'iu']
for name in names :
    counts[name] = counts.get(name,0) + 1
print(counts)
print(counts.get('harry'))

# {'harry': 2, 'iu': 2, 'suzy': 1}
# 2

 위에서 봤었던 코드에서 if else 구문을 한줄로 줄여버렸다. 코드를 설명하기 위해 마지막 줄을 삽입하였다. get메소드는 기본적으로 딕셔너리에서 키가 어떤 값을 갖고 있는지를 반환해준다. 하지만 get안에 카와 동시에 콤마와 어떤 값을 넣게 되면 이 키가 없다면 특정 값을 반환하라는 의미이다.

 

 즉 위 코드는 name이 없으면 0을 반환하고 1을 더하게 시키고 이 것을 name의 값에 넣어주었다. 이것을 반복함으로써 우리는 빈도수를 측정하는 프로그램을 코딩하게 되었다.

 

 이번에는 딕셔너리에서 활용가능한 루프와 메소드를 알아보자.

 

counts = {'harry': 2, 'iu': 2, 'suzy': 1}
for key in counts :
    print(key, counts[key])
print(' ='*30)
print(list(counts))
print(counts.keys())
print(counts.values())
print(counts.items())

# harry 2
# iu 2
# suzy 1
#  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
# ['harry', 'iu', 'suzy']
# dict_keys(['harry', 'iu', 'suzy'])
# dict_values([2, 2, 1])
# dict_items([('harry', 2), ('iu', 2), ('suzy', 1)])

 

 먼저 for 루프를 통해 키와 값을 출력하도록 만들어 보았다. 앞서 배운 인덱스를 활용하면 아주 쉽게 가능하다. 그리고 딕셔너리에서 활용가능한 함수와 메소드를 알아보기위해 구분선을 만들었다.

 

 list함수는 지난 장에서 리스트를 만드는 함수였다. 딕셔너리를 넣게되면 키를 리스트로 만들어냄을 알 수 있다. keys메소드는 키를 리스트로, values메소드는 값을 리스트로, items메소드는 튜플을 이용한 리스트를 보여준다. 참고로 dict_**** 와 같은 문자를 없애려면 list() 함수를 감싸주면 깔끔하게 리스트형식으로 출력된다. 튜플은 뒷장에서 따로 다루도록 하자.

 

 이번에는 앞서 파일에서 배웠던 내용과 결합하여 텍스트 파일내의 문자의 빈도수를 측정하는 프로그램을 코딩해보자. 

참고로 텍스트 파일은 다음과 같다.

 위에서 문자의 빈도수를 측정하고 가장 많은 빈도수를 가진 문자를 나타내보자.

 

fname = input('Enter File : ')
if len(fname) < 1 : fname = 'practice.txt'
hand = open(fname)
di = dict()
for line in hand:
    line = line.rstrip()
    wds = line.split()
    for w in wds :
        di[w] = di.get(w,0) + 1
largest = -1
theword = None
for k, v in di.items():
    print(k,v)
    if v>largest :
        largest = v
        theword = k
print('Done', theword, largest)

# Enter File : 

# Hi! 1
# My 2
# name 3
# is 4
# harry. 1
# Welcome 1
 . . .
# Done is 4

 

 먼저 input함수를 통해 파일명을 입력받게하였다. 1 미만 즉 아무것도 입력하지 않으면 자동으로 내가 원하는 파일을 열게 하였다. 그 후 딕셔너리를 생성하고, 각 줄의 끝의 띄어쓰기나 개행문자를 rstrip으로 지웠다. 그리고 split메소드로 리스트형태로 쪼갰다. 그 후 위에서 했던대로 get메소드를 통해 빈도수를 딕셔너리에 담아주었다.

 

 가장 큰 빈도수를 가진 문자를 측정하기 위해 largest에 -1을 할당하고 theword는 아무것도 없다는 None을 넣었다. 튜플을 이용해 k는 키를 v는 값을 넣어주었다. 확인을 위해 print함수로 각각 출력하였다. 각 문자의 빈도수를 출력하였음을 알 수 있다.

 

 if문을 통해 largest와  값을 비교하고 largest보다 클 경우 그 값을 largest에 넣고, theword에는 키를 넣어줌으로써 가장 큰 문자와 빈도수를 반복비교하며 넣게 하였다.

 

 

 

 

 


 

참고 

 

 

PY4E - Python for Everybody

 

www.py4e.com

 

모두를 위한 프로그래밍 : 파이썬 강좌소개 : edwith

- 커넥트재단

www.edwith.org

 

'Language > Python' 카테고리의 다른 글

<파이썬 기초> 12. 정규식  (0) 2020.11.03
<파이썬 기초> 11. 튜플  (0) 2020.10.27
<파이썬 기초> 09. 리스트  (0) 2020.10.13
<파이썬 기초> 08. 파일  (0) 2020.10.06
<파이썬 기초> 07. 문자열  (0) 2020.10.04