파이썬 자료형-딕셔너리편


  • edwith 강좌를 바탕으로 정리한 내용입니다.

1. 딕셔너리의 정의와 특징

“컬렉션”이란?

  • 여러개의 값을 하나의 변수에 담을 수 있음
  • 변수 안에 공간을 여러개 가짐
  • 변수 안에 서로 다른 공간을 찾는 방법이 있음

“컬렉션”이 아닌 것은?

  • 대부분의 변수는 한 값만을 가짐
  • 변수에 새값을 대입하면 이전값이 덮어씌어짐
x =2
x =4
print(x)

컬렉션의 종류

  • 리스트 : 순서를 유지하는 값들의 선형 컬렉션
    • 프링글스 같음
  • 딕셔너리 : 고유의 라벨을 갖고 있는 값을 넣은 가방
    • 순서라는 것이 없음
    • 마치 라벨을 붙이는 것과 같음
    • 지갑과 캐리어와 같음
    • 안에 던져 넣고 이거줘이거줘 ! 소리치는 것

딕셔너리

  • 파이썬의 가장 강력한 데이터 컬렉션
  • 파이썬에서 빠르게 데이터베이스 같은 연산을 가능하게 함
  • 연관 : 키와 값사이의 연결 > 엄청난 성능
  • 다른 언어에서는 다른 이름으로 불림
    • Associative Array(연관배열) : Perl / PHP
    • Properties or Map or HashMap(속성, 맵, 해쉬맵) - java
    • Property Bag(속성 가방) -C# .NET
  • 리스트는 리스트안에서 원소의 위치를 기반으로 인덱스를 매김
  • 딕셔너리는 가방과 같아, 순서가 없음
  • 따라서 딕셔너리에 넣는 대상은 “조회태그”를 달아 인덱스를 매김
purse = dict()
purse['Money'] = 12
purse['candy'] = 3
purse['tissues'] = 75
print(purse)
print(purse['candy']) # 캔디 달라고 소리침

purse['candy'] = purse['candy']+2
print(purse)

리스트와 딕셔너리의 비교

  • 둘다 원소를 추가하거나 삭제할 수 있음
  • 차이는 인덱싱에서 난다.
    • 리스트에서 인덱싱은 위치를 나타냄
    • 딕셔너리에서 인덱싱은 키값을 나타냄
  • 딕셔너리는 값을 찾기 위해 숫자 대신 키를 사용하는 것만 빼면 리스트와 동일
# 리스트일 경우 : 키를 우리가 정하지 않음
lst = list()
lst.append(21)
lst.append(183)
print(lst)
lst[0] = 23
print(lst)

# 딕셔너리인 경우 : 키는 문자열도 가능하며, 우리가 지정할 수 있음
ddd = dict()
ddd['age'] = 21
ddd['course'] = 182
print(ddd)
ddd['age'] = 23
print(ddd)

딕셔너리 표현 (상수)

  • 딕셔너리는 중괄호로 표현하며 키:값 쌍 목록을 가짐
  • 사이가 비어있는 중괄호로 빈 딕셔너리를 만들 수 있음
jjj = {'chunk':1, 'fred':42, 'jan':100}
print(jjj)
ooo = {} # emty dictionary
print(ooo)

2. 딕셔너리 응용

문제 :

빈도수를 세리자! 데이터를 한번에 다 볼 수 없으니 하나씩 보고 세릴것! 어떤 이름이 가장 많이 나왔는지 볼 것.

  • 이름을 보고 몇 번 나왔는지 적기
  • 새로운 이름을 보면 목록에 이름을 추가하고 작대기 표시해서 추가해 나간다.
  • 그리고 빈도수를 봐서 가장 큰 것을 고름.

가장 많이 나온 이름 찾기

  • 대상이 얼마나 자주 보이는 지를 카운팅
ccc = dict()
ccc['csev'] = 1
ccc['cwen'] = 1
print(ccc)

ccc['cwen'] = ccc['cwen']+1
print(ccc)

딕셔너리 Traceback 에러

  • 딕셔너리에 없는 키를 참조하는 것은 오류를 발생
  • in 연산자를 사용하여 키가 딕셔너리에 있는지 확인 가능
ccc = dict()
print(ccc['csev'])
'csev' in ccc

새로운 이름을 보는 경우

  • 새로운 이름을 보게되면, 딕셔너리에 새 원소로 집어 넣고,
  • 두 번째 혹은 그 이상 본 이름은, 해당하는 이름에 1을 더함
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

print(counts)

딕셔너리 메소드 : get

  • 키가 이미 딕셔너리에 있는지 확인하고
  • 키가 없다면 기본값으로 설정하는 확인 패턴 많이 사용 > get()이라는 메소드가 존재
if name in counts:
	x = counts[name]
else:
	x = 0

x = counts.get(name,0)
  • get을 이용해서 숫자세기
counts = dict()
names = ['csev','cwen','csev','zqian','cwen']
for name in names:
	counts[name] = counts.get(name,0)+1 # get(key_name, default값)
print(counts)

텍스트에서 단어 수 세기

counts = dict()
line = input('Enter a line of test:')
words = line.split()

print('words:', words)
print('Counting..')

for word in words:
	count[word] = counts.get(word,0)+1

print('Counts', counts)

한 줄의 텍스트를 받고 단어로 나눈 다음, 단어의 수를 세리는 방법

유한루프와 딕셔너리

  • 딕셔너리 안에 저장되는 순서가 없다고 해도,
  • for 문을 작성하여 딕셔너리의 모든 원소를 돌 수 있음
counts = {'chunk':1, 'fred':42, 'jan': 100}

for key in counts:
	print(key, counts[key])

키와 값 목록 검색

  • 딕셔너리에서 키나 값이나 아이템의 목록을 얻을 수 있음
jjj = {'chunk':1, 'fred':42, 'jan': 100}

print(list(jjj))
print(jjj.keys())
print(jjj.values())
print(jjj.items()) # 튜플로 받음
# 약간의 복잡한 형태로 값을 줌 # 다음 시간에 튜블을 배움

두개의 반복변수!

  • 두개의 반복변수를 사용하여 딕셔너리의 키-값 쌍을 반복해서 다룸
  • 매번 반복할 때, 첫번째 변수는 키, 두 번째 변수는 키에 대응하는 값을 나타냄
jjj ={'chunk':1, 'fred':42, 'jan': 100}

for aaa,bbb in jjj.items():
	print(aaa,bbb)
  • 파일내의 단어의 갯수를 파악해보자
name = input('Enter file:')
handle = open(name)

# 단어의 갯수를 세리는 딕셔너리 생성
counts = dict()
for line in handel:
	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)