ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [부스트코스] 모두를 위한 파이썬(PY4E) 6주차 딕셔너리, 튜플
    PYTHON/부스트코스 PY4E 2022. 9. 28. 21:39
    728x90

    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

     

    딕셔너리 활용

     

    여러값에 대해 비교 가능

    키를 기준으로 정렬하기

    위의 두 가지 특성을 활용하면 키를 기준으로 딕셔너리를 정렬할 수 있습니다. 방법은 다음과 같습니다.

    1. 딕셔너리에서 items 메소드를 실행해 튜플로 이루어진 리스트 형태로 만든다.
    2. 이 리스트를 sorted 함수로 정렬한다. 그러면 각각의 튜플의 왼쪽 값, 즉 키를 기준으로 정렬이 된다.

    즉, 다음과 같은 코드로 딕셔너리를 키를 기준으로 정렬할 수 있습니다.

     

    값을 기준으로 정렬하기

    1. 딕셔너리에서 items 메소드를 실행한다.
    2. 튜플을 활용해 키와 값을 분리한다.
    3. 키와 값의 위치를 바꾼 리스트를 생성한다.
    4. 생성된 리스트를 정렬한다.

    이 과정을 코드로 표현하면 다음과 같습니다. 실행결과를 보시면 값을 기준으로 오름차순 정렬이 된 것을 볼 수 있다

    만약 내림차순으로 정렬하고 싶다면 다음과 같이 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

     

Designed by Tistory.