-
[부스트코스] 모두를 위한 파이썬(PY4E) 6주차 딕셔너리, 튜플PYTHON/부스트코스 PY4E 2022. 9. 28. 21:39728x90
6주차는 09.딕셔너리와 10.튜플에 대해 학습했다
09. <딕셔너리>
핵심 키워드 미리보기
컬렉션
딕셔너리
연관배열
빈도수 계산
in 연산자
get 메소드
컬렉션이란?
하나의 변수에는 하나의 값만 할당해야 한다 하지만 하나의 변수에 여러 값을 할당 할 수 있는 것이 있다 이처럼 하나의 변수에 여러 값을 할당 할 수 있는 것을 컬렉션이라고 한다
딕셔너리
딕셔너리는 리스트와 달리 순서는 없지만 키(key)와 value가 존재한다
라벨 붙이는 것과 비슷하다
문자 그대로 사전을 떠올리면 된다
한영사전에서 영어 단어와 한글 뜻이 같이 나와있는 걸 생각해보면 이해하기 쉽다
{key : value , key : value.....}
항상 위의 예시처럼 순서대로 시행되지는 않는다
[]안의 값을 키(key)이라고 한다 키를 입력할 때도 [key] = value 순이고 접근시에도
print(purse['candy']) 를 입력하면 value인 3이 출력된다
그리고 키를 업데이트 할 수도 있다
purse['candy'] =purse['candy']+2 #원래 cnady값에 2 더한 값이 value에 저장된다
print(purse)
연관배열(Associative Arrays)
키와 값이 연결되는 개념을 연관배열이라고 한다
리스트와 비슷한 접근방식이지만 키를 가지고 접근한다는 차이점이 있다
딕셔너리에서 연관은 키와 값 사이의 연결 관계다
리스트에는 위치와 값 사이에 연결관계가 있다
연관 배열의 다양한 이름
- property maps : Perl / PHP
- hash maps : Java
- property bags : C# / .Net
사람의 방식으로 이름 빈도수 세기
여러개 이름을 보고 그 빈도수를 세는 방식
1) 새로운 이름을 보면 목록에 추가한다.
2) 추가된 이름이 1번 나왔다는 표시를 한다.
3) 목록에 있는 이름이면 기존의 숫자에 1을 더해준다.
4) 모든 이름을 살펴본 후 표시의 갯수를 세어 가장 높은 것을 찾는다.그런데 개수가 수백만개면 세는 것이 매우 어렵다
이럴땐 딕셔너리를 사용하면 쉽게 해결 할 수 있다
1) 이미 저장되어 있는 이름인지 확인한다
2-1) 만약 이미 저장되어 있는 이름이면 1을 더한다
2-2) 만약 저장되어 있지 않은 이름이면 이름을 저장하고 1을 배열한다
3) 최종 결과 중 빈도가 많은 이름을 찾는다이미 저장되어 있는 이름인지 확인하는 것이 매우 중요! -> 저장이 안되어 있는 이름이면 에러가 나기 때문이다
in 연산자
이런 문제를 for , list,문자열에서 사용했던 in 연산자를 사용해 해결 할 수 있다
딕셔너리 안에 원하는 이름이 있는지 확인하는 방법이다
위의 경우는 없으니까 False가 나온다
있는 경우는 True가 나온다
get 메소드
이와 같이 딕셔너리에 존재하는 키인지 아닌지 여부에 따라 처리하는 패턴은 get이라는 메소드를 사용해서 간결하게 해결할 수 있다
여기에서 counts.get(name, 0)의 의미는 counts 딕셔너리에 name이라는 키가 존재할 경우 name에 대한 값을 불러오고,
그렇지 않을 경우에는 counts 딕셔너리에 name이라는 키에 0이라는 값을 갖는 데이터를 추가하라는 의미다
10. <리스트>
핵심 키워드 미리보기
튜플
immutable
sorted 함수
List comprehension
리스트(List)와 비슷한 컬렉션, 튜플(Tuple)
튜플은 리스트와 유사하다
리스트처럼 순서가 있고 인덱스로 접근이 가능하다
하지만 리스트와 달리 ()를 사용한다 그리고 리스트와 달리 수정은 불가능하다
변경 불가능한 속성 (immutable)
위에 말한 것처럼 리스트는 변경이 불가능하다
이처럼 값을 변경하려하면 에러가 뜬다
하지만 변경 불가능한 속성 때문에 튜플은 리스트보다 훨씬 더 효율적으로 동작한다
용량도 적게 차지하고, 접근도 훨씬 빠르다
하지만 변경이 불가능해서 한번 생성되면 정렬이나 값추가, 순서 변경 역시 불가능하다
즉, 값을 변경하지 않아도 되는 count, index와 같은 함수만 작동한다
튜플의 장점
임시변수로 활용
좌변 사용하면 간단하게 여러변수에 값을 넣을 수 있다
단, 좌우변의 개수가 일치해야한다
x,y는 4와 fred이다
a,b는 99,88이다
y는? fred
a는? 99
딕셔너리 활용
여러값에 대해 비교 가능
키를 기준으로 정렬하기
위의 두 가지 특성을 활용하면 키를 기준으로 딕셔너리를 정렬할 수 있습니다. 방법은 다음과 같습니다.
- 딕셔너리에서 items 메소드를 실행해 튜플로 이루어진 리스트 형태로 만든다.
- 이 리스트를 sorted 함수로 정렬한다. 그러면 각각의 튜플의 왼쪽 값, 즉 키를 기준으로 정렬이 된다.
즉, 다음과 같은 코드로 딕셔너리를 키를 기준으로 정렬할 수 있습니다.
값을 기준으로 정렬하기
- 딕셔너리에서 items 메소드를 실행한다.
- 튜플을 활용해 키와 값을 분리한다.
- 키와 값의 위치를 바꾼 리스트를 생성한다.
- 생성된 리스트를 정렬한다.
이 과정을 코드로 표현하면 다음과 같습니다. 실행결과를 보시면 값을 기준으로 오름차순 정렬이 된 것을 볼 수 있다
만약 내림차순으로 정렬하고 싶다면 다음과 같이 sorted 함수에 reverse 옵션을 True로 설정하면 된다
리스트 컴프리헨션
딕셔너리를 키를 기준으로 정렬해서 출력하는 코드
추가자료 https://wikidocs.net/22805
1) 리스트 컴프리헨션
## 리스트 생성하기 기존에 배운 문법으로 1부터 10까지 정수를 순서대로 가지고 있는 리스트를 생성하는코드는 다음과 같습니다. ``` numbers = [] for ...
wikidocs.net
6주차 미션
6주차는 너무 어려워서 1번 문제밖에 풀지 못했습니다
그래서 1번을 제외하고는 문제만 올리겠습니다
📌Q1. 역사 문제를 하나 내보겠습니다. 고려시대와 조선시대 왕 이름 중에서 고려에도 있고 조선에도 있는 이름은 몇개 일까요? 한 번에 딱 안 떠오른다면 왕 이름을 드릴테니 파이썬 함수로 만들어서 출력 해봅시다.
- 😲조건1 - 중복되는 왕 이름 출력
- 😲조건2 - 중복되는 왕 이름의 수 출력
# 왕이름 korea_king = "태조,혜종,정종,광종,경종,성종,목종,현종,덕종,정종,문종,순종,선종,헌종,숙종,예종,인종,의종,명종,신종,희종,강종,고종,원조,충렬왕,충선왕,충숙왕,충혜왕,충목왕,충정왕,공민왕,우왕,창왕,공양왕" chosun_king = "태조,정종,태종,세종,문종,단종,세조,예종,성종,연산군,중종,인종,명종,선조,광해군,인조,효종,현종,숙종,경종,영조,정조,순조,헌종,철종,고종,순종"
- ✅출력 예시
king(korea_king, chosun_king) 조선과 고려에 모두 있는 왕 이름 : 태조 조선과 고려에 모두 있는 왕 이름 : 정종 조선과 고려에 모두 있는 왕 이름 : 경종 조선과 고려에 모두 있는 왕 이름 : 성종 조선과 고려에 모두 있는 왕 이름 : 현종 조선과 고려에 모두 있는 왕 이름 : 문종 조선과 고려에 모두 있는 왕 이름 : 순종 조선과 고려에 모두 있는 왕 이름 : 헌종 조선과 고려에 모두 있는 왕 이름 : 숙종 조선과 고려에 모두 있는 왕 이름 : 예종 조선과 고려에 모두 있는 왕 이름 : 인종 조선과 고려에 모두 있는 왕 이름 : 명종 조선과 고려에 모두 있는 왕 이름 : 고종 조선과 고려에 모두 있는 왕 이름은 총 13개 입니다
더보기korea_king = "태조,혜종,정종,광종,경종,성종,목종,현종,덕종,정종,문종,순종,선종,헌종,숙종,예종,인종,의종,명종,신종,희종,강종,고종,원조,충렬왕,충선왕,충숙왕,충혜왕,충목왕,충정왕,공민왕,우왕,창왕,공양왕"
chosun_king = "태조,정종,태종,세종,문종,단종,세조,예종,성종,연산군,중종,인종,명종,선조,광해군,인조,효종,현종,숙종,경종,영조,정조,순조,헌종,철종,고종,순종"
common = []
for i in list(korea_king.split(",")):
if i in list(chosun_king.split(",")):
common.append(i)
print("조선과 고려에 모두 있는 왕 이름:",i)
print("조선과 고려에 모두 있는 왕 이름은 총:",len(common),"개입니다")🌳정답 예시 코드
def king(korea, chosun): king_dict = dict() # 왕 이름을 담을 dict korea = korea.split(",") # 문자열을 ,기준으로 list 변경 chosun = chosun.split(",") # 문자열을 ,기준으로 list 변경 # 고려의 왕 이름 저장 후 값을 1로 설정 for kor in korea: king_dict[kor] = 1 # 조선의 왕 탐색 for cho in chosun: if king_dict.get(cho, 0) >= 1: # 왕 이름이 존재 여부 있으면 1이상의 값이 나옴 king_dict[cho] = king_dict[cho] + 1 # 존재하면 +1 else: continue # 없으면 건너 뜀 # 리스트 컴프리헨션을 사용하면 아래 코드 # repeated_king = [ k for (k, v) in king_dict.items() if v >= 2 ] repeated_king = [] # 중복된 왕 이름을 담는 리스트 for (k,v) in king_dict.items(): if v >= 2: # 왕 이름이 2이상이면 중복된 것 repeated_king.append(k) count = 0 # 카운트 변수 for king in repeated_king: print(f"조선과 고려에 모두 있는 왕 이름 : {king}") count = count + 1 # 존재하면 +1 print(f"조선과 고려에 모두 있는 왕 이름은 총 {count}개 입니다")
📌Q2. 여러분은 6명의 멤버를 거느리는 영업팀의 영업관리자 입니다. 각 멤버별로 올해 실적을 보고 잘한 멤버는 보너스를 주고 못한 멤버는 면담을 하려고 합니다. 파이썬을 이용하여 함수를 만들어 보너스 대상자와 면담 대상자를 골라주세요.
- 😲조건 1 - 예비 보너스 대상자는 평균 실적 1등 2등 입니다.
- 😲조건 2 - 예비 면담 대상자는 평균 실적 5등 6등 입니다.
- 😲조건 3 - 보너스 대상자의 평균 실적이 5보다 크지 않으면 보너스 대상자에서 제외 됩니다.
- 😲조건 4 - 면담 대상자의 평균 실적이 3보다 크면 면담 대상자에서 제외 됩니다.
# 이름, 실적 member_names = ["갑돌이", "갑순이", "을돌이", "을순이", "병돌이", "병순이"] member_records = [[4,5,3,5,6,5,3,4,1,3,4,5],[2,3,4,3,1,2,0,3,2,5,7,2], [1,3,0,3,3,4,5,6,7,2,2,1],[3,2,9,2,3,5,6,6,4,6,9,9], [8,7,7,5,6,7,5,8,8,6,10,9],[7,8,4,9,5,10,3,3,2,2,1,3]]
- ✅출력 예시
sales_management(member_names, member_records) 보너스 대상자 병돌이 보너스 대상자 을순이 면담 대상자 갑순이
📌Q3. 예금 금리가 너무 낮아서 주식을 시작했습니다. 아래와 같이 매수한 종목 이름, 수량, 매수 평균 금액이 있습니다. 판매가는 따로 주어집니다. 종목과 수익률만 출력하시고 종목별 수익률이 높은 순서대로 출력해주세요. (소수 둘째자리까지 출력)stocks = "삼성전자/10/85000,카카오/15/130000,LG화학/3/820000,NAVER/5/420000" sells = [82000, 160000, 835000, 410000]
# 소수 둘째자리까지 출력하는 방법 a = 3.141592 print(f"{a:.3}") 3.14
- ✅출력 예시
stock_profit(stocks, sells) 카카오의 수익률 23.1 LG화학의 수익률 1.83 NAVER의 수익률 -2.38 삼성전자의 수익률 -3.53
📌Q4. 여러분은 어떤 상품을 판매하고 있습니다. 매월 상품을 많이 구매해준 VIP회원에게 할인 쿠폰을 제공해주려고 합니다. 아래와 같은 회원 정보가 있을 때 회원 정보를 출력하고 할인 쿠폰을 받을 회원이 누구인지 출력하는 함수를 만들어 주세요.- 😲조건1 - 8회 이상 구매한 회원이 VIP대상
- 😲조건2 - 전화번호가 없으면 쿠폰을 받을 수 없음
- 😲조건3 - 전화번호가 없으면 000-0000-0000으로 출력할 것
# 6명의 회원이고 "아이디,나이,전화번호,성별,지역,구매횟수" 순서로 입력되어 있음 info = "abc,21세,010-1234-5678,남자,서울,5,cdb,25세,x,남자,서울,4,bbc,30세,010-2222-3333,여자,서울,3,ccb,29세,x,여자,경기,9,dab,26세,x,남자,인천,8,aab,23세,010-3333-1111,여자,경기,10"
- ✅출력 예시
good_customer(info) {'아이디': ['abc', 'cdb', 'bbc', 'ccb', 'dab', 'aab'], '나이': ['21세', '25세', '30세', '29세', '26세', '23세'], '전화번호': ['010-1234-5678', '000-0000-0000', '010-2222-3333', '000-0000-0000', '000-0000-0000', '010-3333-1111'], '성별': ['남자', '남자', '여자', '여자', '남자', '여자'], '지역': ['서울', '서울', '서울', '경기', '인천', '경기'], '구매횟수': [5, 4, 3, 9, 8, 10]} 할인 쿠폰을 받을 회원정보 아이디:aab, 나이:23세, 전화번호:010-3333-1111, 성별:여자, 지역:경기, 구매횟수: 10
<09. 딕셔너리 강의 들으러 가기>
https://www.boostcourse.org/cs122/joinLectures/76170?isDesc=false
모두를 위한 파이썬 (PY4E)
부스트코스 무료 강의
www.boostcourse.org
<10. 리스트 강의 들으러 가기>
https://www.boostcourse.org/cs122/joinLectures/76171?isDesc=false
모두를 위한 파이썬 (PY4E)
부스트코스 무료 강의
www.boostcourse.org
<오늘 올린 코드 자료>
https://colab.research.google.com/drive/14hV4u_bYI79lkx80nkl_uw3MQu2dGc1g?usp=sharing
부스트코스 py4e 5주차
Colaboratory notebook
colab.research.google.com
'PYTHON > 부스트코스 PY4E' 카테고리의 다른 글
[부스트코스] 모두를 위한 파이썬(PY4E) 5주차 리스트 (0) 2022.09.28 [부스트코스] 모두를 위한 파이썬(PY4E) 4주차 문자열,파일 (0) 2022.09.22 [부스트코스] 모두를 위한 파이썬(PY4E) 3주차 루프와 반복문 (0) 2022.09.14 [부스트코스] 모두를 위한 파이썬(PY4E) 2주차 조건부 실행, 함수 (0) 2022.09.13 [부스트코스]PY4E 수료증 인증 (0) 2022.08.30