정리 노트/부스트코스 PY4E 2022

[부스트코스] 모두를 위한 파이썬 (PY4E) 6주 차_정리 (7/8)

우주바다 2022. 9. 29. 16:55
728x90

▼ 강의 보러 가기 ▼

www.boostcourse.org/cs122


마지막 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')]

 


 

*다음 포스팅 (8/8) 바로가기

728x90
반응형