본문 바로가기
Python/PY4E

PY4E Chapter 9. Dictionaries

by 전자여우 2022. 8. 8.

Dictionary

딕셔너리는 중괄호({})로 이루어져 있으며 리스트와 다르게 순서가 없다. 대신 키 값으로 호출이 가능하다. 연관배열(Associative Arrays)이라고도 한다.

리스트와 같이 원소의 추가와 삭제가 가능하다.

# 비어있는 딕셔너리 만들고 추가하기
purse = dict() # 빈 중괄호도 가능
purse['money'] = 12
purse['candy'] = 3
purse['tissues'] = 75
print(purse) # {'money' : 12, 'tissues' : 75, 'candy : 3}

# 연산하기
purse['candy'] = purse['candy'] + 2
print(purse) # {'money' : 12, 'tissues' : 75, 'candy : 5}

 

딕셔너리를 이용한 리스트 내의 요소 카운팅(Counting with Dictionaries)

# 딕셔너리를 이용해 리스트 내의 요소 카운팅
counts = dict()
names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for name in names:
	if name not in counts:
    	counts[name] = 1 # 없으면 추가
    else:
    	counts[name] = counts[name] + 1 # 있으면 value값에 +1
print(counts)

get() 메소드의 매개 변수로 키와 기본값을 넣어주면 이미 존재하는 키라면 키의 값을 반환하고 키가 존재하지 않으면 기본값으로 설정한다.

이를 이용해 위의 코드를 더 간단하게 만들 수도 있다.

counts = dict()
names = ['csev', 'cwen', 'csev', 'zqian', 'cwen']
for name in names:
	counts[name] = counts.get(name, 0) + 1
print(counts)

# split() 메소드를 이용해 문자열을 리스트로 만들어 카운팅하기
counts = dict()
print('Enter a line of text:')
input('')
words = line.split()
print('Words: ', words) # 딱히 필요한 부분은 아닌 것 같다.
print('Counting...') # 딱히 필요한 부분은 아닌 것 같다.
for word in words:
	counts[word] = counts.get(word, 0) + 1
print('Counts', counts)

 

딕셔너리의 값 출력하기

counts = {'chuck' : 1, 'fred' : 42, 'jan' : 100}
for key in counts:
	print(key, counts[key])
# jan 100
# chuck 1
# fred 42

print(list(counts)) # ['jan', 'chuck', 'fred']
print(counts.keys()) # ['jan', 'chuck', 'fred']
print(counts.values()) # [100, 1, 42]
print(counts.items()) # [('jan', 100),('chuck', 1),('fred', 42)]

for aaa,bbb in counts.items():
	print(aaa,bbb)
# jan 100
# chuck 1
# fred 42

 

파일 내부에서 가장 많이 쓰인 단어 찾는 코드

name = input('Enter file: ')
handle = open(name)

counts = dict()
for line in handle:
	words = line.split()
    for word in words:
    	counts[word] = counts.get(word,0) + 1

bigcount = None
bigword = None
for word,count in counts.items():
	if bigcount is None or count > bigcount:
    	bigword = word
        bigcount = count

print(bigword, bigcount)

 

Assignment

Assignment 9.4는 mbox-short.txt를 읽고 누가 가장 많은 메일 메시지를 보냈는지 확인하는 프로그램을 작성하는 것이었다. Files 챕터와 같이 'From: ' 행을 검색하고 해당 행을 split() 함수를 이용해 리스트로 만든 뒤 메일 주소를 추출해서 횟수를 카운팅해 딕셔너리에 저장한다. 그리고 maximum loop를 활용하여 가장 많이 보낸 사람을 찾는 것이었다.

나의 풀이는 아래와 같다.

# ex_9_4
name = input("Enter file:")
if len(name) < 1:
    name = "mbox-short.txt"
handle = open(name)

count = dict()
most1 = None
most2 = None

for line in handle:
    if not line.startswith('From ') : continue
    line = line.split()
    line = line[1]
    count[line] = count.get(line, 0) + 1
    
for most,most0 in count.items():
    if most2 is None or most2 < most0:
        most1 = most
        most2 = most0
print(most1, most2)

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

PY4E Chapter 11. Regular Expressions  (0) 2022.08.09
PY4E Chapter 10. Tuples  (0) 2022.08.08
PY4E Chapter 8. Lists  (0) 2022.08.08
PY4E Chapter 7. Files  (0) 2022.08.07
PY4E Chapter 6. Strings  (0) 2022.08.05

댓글