▼ 강의 보러 가기 ▼
마지막 6주차 학습 범위는 9,10단원!
[ 이번 주는 무엇을 배웠나요? PY4E 요약 정리! ]
9. 딕셔너리
1) 콜렉션 : 리스트와 딕셔너리
리스트는 순서대로 정렬된 콜렉션으로 데이터를 추가하면 리스트의 끝에 추가된다.
또한 0부터 n-1번 위치까지 순서대로 n개의 원소가 저장되어있다.
딕셔너리도 리스트 처럼 여러개의 값을 가지는 콜렉션이지만 순서가 없다.
(*파이썬 3.6 부터는 순서를 기억한다.
그 이전 버전에서는 orderdict를 사용해야한다.)
2) 빈 딕셔너리 생성
리스트를 변수명 = [] 또는 변수명 = list() 로 생성할 수 있었던 것 처럼
딕셔너리도 변수명 = { } 또는 변수명 = dict() 로 생성할 수 있다.
3) key 와 value
딕셔너리의 원소는 이름표 역할을 하는 key와 그 값인 value의 쌍으로 이루어져있다.
딕셔너리 이름['key'] = value 형태로 새로운 값을 저장할 수 있다.
user = dict() # 또는 purse = {} 로 생성
user['name'] = uju # 'name'라는 키에 'uju'라는 값 연결
user['age'] = 3 # 'age'라는 키에 3이라는 값 연결
user['likes'] = kirby # 'likes'라는 키에 'kirby'라는 값 연결
키를 통해 값에 접근해 출력할 수 있고, 내용을 바꿀 수도 있다.
print(user['age'])
# 출력값 : 3
user['age'] = user['age'] + 2
print(user)
#{'name': 'uju', 'age': 5, 'likes': kirby}
4) 딕셔너리를 활용해 이름 빈도수 세기
1) 이미 저장된 이름인지 확인
2-1) 저장된 이름인 경우 +1
2-2) 없는 이름인 경우 이름을 저장하고 1을 배정
3) 최종 결과에서 빈도수를 확인할 수 있고
이를 비교해서 최대, 최소값을 찾을 수 있다.
*만약 없는 키를 찾으려고 하면 오류가 발생하기 때문에
이미 저장된 이름인 지 확인하는 부분이 중요하다.
-> in 연산자를 통해 bool 값으로 확인할 수 있다.
counts = dict()
names = ['uju', 'bada', 'kirby', 'kirby']
for name in names :
if name in counts:
counts[name] = counts[name] + 1
else :
counts[name] = 1
print(counts)
# {'uju': 1, 'bada': 1, 'kirby': 2}
* not 연산자를 통해 아래와 같이 작성할 수도 있다.
counts = dict()
names = ['uju', 'bada', 'kirby', 'kirby']
for name in names :
if name not in counts:
counts[name] = 1
else :
counts[name] = counts[name] + 1
print(counts)
# {'uju': 1, 'bada': 1, 'kirby': 2}
5) get 메소드
딕셔너리에 존재하는 키인지 아닌지 여부에 따라 처리하는 패턴은
get 메소드로 간단하게 처리할 수 있다.
counts = dict()
names = ['uju', 'bada', 'kirby', 'kirby']
for name in names :
counts[name] = counts.get(name, 0) + 1
print(counts)
# {'csev': 2, 'zqian': 1, 'cwen': 2}
counts.get(name, 0)
: name이라는 키가 존재하면 name에 대한 값을 불러오고, 아니라면
counts 딕셔너리 내부에 name이라는 키를 추가하고
그 값으로 0을 갖는 데이터를 추가하라는 의미.
6) dictionary 와 loop
반복문을 통해 키 - 밸류를 출력할 수 있다.
counts = { 'uju' : 1 , 'bada' : 22, 'kirby': 100}
for key in counts:
print(key, counts[key])
# uju 1
# bada 22
# kirby 100
6) key - value 얻고 저장하기
.keys()
.values()
.items() 메소드 활용.
# 딕셔너리를 리스트로 변환하면 키로만 구성된 리스트를 얻는다
name = { 'uju' : 1 , 'bada' : 22, 'kirby': 100}
print(list(name))
# ['uju', 'bada', 'kirby']
# 딕셔너리의 keys 메소드를 사용해도 같은 결과.
name = { 'uju' : 1 , 'bada' : 22, 'kirby': 100}
print(name.keys())
# ['uju', 'bada', 'kirby']
# 값으로만 구성된 리스트를 얻으려면 values 메소드 사용
name = { 'uju' : 1 , 'bada' : 22, 'kirby': 100}
print(name.values())
# [1, 22, 100]
# 키, 밸류 모두 얻으려면 iems
name = { 'uju' : 1 , 'bada' : 22, 'kirby': 100}
print(name.items())
# [('uju', 1), ('bada', 22), ('kirby', 100)]
7) text 파일 분석: 가장 많이 나온 단어 찾기
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)
10. 튜플
1) 값 변경이 불가능한 리스트
리스트와 비슷한 부분이 많지만, 내부 값을 변경할 수 없다.
한 번 생성되면 정렬(순서변경), 값 변경이나 추가 등이 불가능하다.
변경불가능(immutable) 속성때문에 용량을 적게 차지하며
데이터 처리 속도가 빠른 장점이 있다.
(불변한다는 것을 컴퓨터가 미리 인지, 접근이 빠름)
2) 튜플의 특징
이름 = ()
소괄호로 비어있는 튜플을 만들 수 있으며 괄호는 생략할 수도 있다.
튜플 안에 값을 하나만 넣을 때는 뒤에 ,(콤마)를 붙여야한다.
내부 값은 중복될 수 있고, 중첩도 가능하다.
a = (1,2,(3,4))
print(f'a[0]:{a[0]}')
# 출력값 a[0]: 1
3) 튜플 값 비교
(0, 1, 2) < (5, 1, 2)
# True
(0, 1, 2000000) < (0, 3, 4)
# True
( 'Jones', 'Sally' ) < ('Jones', 'Sam')
# True
가장 왼쪽에 있는 원소부터 차례대로 비교,
같은 값이라면 오른쪽으로 이동하며 숫자를 비교한다.
더 큰 값이 있다면 나머지 원소는 비교하지 않는다.
4) 임시 변수로 활용
좌변에 사용하면 여러 변수에 한 번에 값을 넣을 수 있다.
(x,y) = (1,2)
a,b = 3,4
print(x,y) # 1,2
print(a,b) # 3,4
5) swap
임시변수 없이 간편하게 원소를 서로 바꿀 수 있다.
x, y = 1, 10
print(x, y)
# 1 10
x, y = y, x
print(x, y)
# 10 1
6) 딕셔너리 정렬
딕셔너리에서 items 메소드를 실행해 튜플로 이루어진 리스트 형태로 만든다.
이 리스트에 sorted 함수를 사용하면 튜플의 왼쪽 값, 즉 키를 기준으로 정렬된다.
d = {'b':1, 'a':10, 'c':22}
d.items()
# dict_items([('b', 1), ('a', 10), ('c', 22)])
sorted(d.items())
# [('a', 10), ('b', 1), ('c', 22)]
7) 값을 기준으로 정렬하기
딕셔너리에서 items 메소드 실행 > 튜플로 키와 값 분리.
키 - 값 위치를 바꾼 리스트 생성. > 생성된 리스트를 정렬.
user = {'name':'uju', 'age':'500', 'likes':'kirby'}
tmp = list()
for k, v in user.items() :
tmp.append( (v, k) )
print(tmp)
# [('uju','name'),('500','age'),('kirby','likes')]
tmp = sorted(tmp)
print(tmp)
# [('500','age'),('kirby','likes'),('uju','name')]
7) 리스트 컴프리헨션 (List comprehension)
직관적으로 리스트를 생성하는 방법.
짧아서 가독성이 좋고 실행 속도도 더 빠르다.
대괄호 안에 실행할 내용을 먼저 작성하고
for , if 로 원하는 동작을 실행할 수 있다.
c = {'a':10, 'b':1, 'c':22}
tmp = list()
for k, v in c.items() :
tmp.append( (v, k) )
tmp = sorted(tmp)
print(tmp)
# [(1, 'b'), (10, 'a'), (22, 'c')]
# -- 리스트 컴프리헨션 -- (결과값 동일)
c = {'a':10, 'b':1, 'c':22}
print( sorted( [ (v,k) for k,v in c.items() ] ) )
# [(1, 'b'), (10, 'a'), (22, 'c')]
'정리 노트 > 부스트코스 PY4E 2022' 카테고리의 다른 글
[코칭스터디] 모두를 위한 파이썬 <PY4E 2022> 수료 후기 (8/8) (0) | 2022.10.02 |
---|---|
[부스트코스] 모두를 위한 파이썬 (PY4E) 5주 차_정리 (6/8) (0) | 2022.09.28 |
[부스트코스] 모두를 위한 파이썬 (PY4E) 4주 차_정리 (5/8) (0) | 2022.09.27 |
[부스트코스] 모두를 위한 파이썬 (PY4E) 3주 차_정리 (4/8) (2) | 2022.09.20 |
[부스트코스] 모두를 위한 파이썬 (PY4E) 2주 차_정리 (3/8) (0) | 2022.09.15 |