ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CHAPTER 8] 딕셔너리와 집합
    Deep Learning/인공지능 입문 코딩 2021. 5. 24. 14:49
    728x90

    여러개의 데이터를 한꺼번에 저장하는 방법중 하나인 딕셔너리에 대해 알아보자.


    딕셔너리(dictionary)

    딕셔너리(dictionary)는 리스트와 같이 파이썬에서 기본 자료형으로 제공되고있다.

    딕셔너리키-값(key-value)의 쌍으로 이루어져있다.

     

    딕셔너리 생성

    아래와 같이 생성한다.

    >>> phone_book = {}
    >>> phone_book['홍길동'] = "010-1234-1234"
    >>> phone_book
    {'홍길동': '010-1234-5678'}

    '홍길동' 은 key, '010-1234-1234'는 value가 된다.

     

    딕셔너리를 생성하면서 초기화하는 방법은 아래와 같다.

    >>> phone_book = {"홍길동": "010-1234-5678"}
    >>> phone_book
    {'홍길동': '010-1234-5678'}

    처음 접해보는 형태의 자료형이라 낯설었다.

    자주 쓰다보면 사용법이 익숙해지니 자주 사용해보자.

     

    딕셔너리를 조회할 때는 key값으로  value를 얻을 수 있다.

    person_dic = {'Name': '홍길동', 'Age': 7, 'Class': '초급'} 
     
    print(person_dic['Name']) 
    print(person_dic['Age']) ​
    홍길동
    27

    딕셔너리에 사용할 수 있는 메소드

    딕셔너리에 사용할 다양한 메소드들에 대해 살펴보자.

    keys(), values()

    딕셔너리의 모든 key와 value를 조회하고 싶을때는 keys(), values() 메서드를 사용한다.

    >>> phone_book.keys()
    dict_keys(['홍길동', '강감찬', '이순신'])
    >>> phone_book.values()
    dict_values(['010-1234-5678', '010-1234-5679', '010-1234-5680'])

    items()

    딕셔너리의 모든 key와 value를 함께 조회할 때는 items() 메서드를 사용한다.

    >>> phone_book.items() 
    dict_items([('홍길동', '010-1234-5678'), ('강감찬', '010-1234-5679'), ('이순신', '010-1234-5680')])

    sorted()

    key값을 기준으로 정렬하여 리스트를 반환한다.

    >>> sorted(phone_book)
    ['강감찬', '이순신', '홍길동']

     

    두 번째 항목인 값에 대하여 정렬할 것인가를 key 매개변수를 사용하여 결정한다.

    phone_book.items()의 반환값을 lambda함수로 전달한다.

    lambda 함수가 등장하는데 조금 뒤에 상세히 살펴보자.

    간단하게 설명하면 x[0] 는 phone_book.items()의 첫 번째 항목, 즉 key값이다.

    phone_book의 key값에 대하여 정렬할 것이라는 뜻이다.

    >>> sorted_phone_book = sorted(phone_book.items(), key=lambda x: x[0])
    >>> print(sorted_phone_book)
    [('강감찬', '010-1234-5679'), ('이순신', '010-1234-5680'), ('홍길동', '010-1234-5678')]

    del

    딕셔너리의 항목을 삭제 하려면 del을 이용한다.

    >>> del phone_book["홍길동"]
    >>> print(phone_book)
    {'강감찬': '010-1234-5679', '이순신': '010-1234-5680'}

    clear()

    모든 항목을 삭제 하려면 clear()를 이용한다.

    >>> phone_book.clear()
    >>> print(phone_book)
    {}

    메소드 정리

    메소드 기능
    keys() 딕셔너리 내의 모든 key를 반환한다.
    values() 딕셔너리 내의 모든 value를 반환한다.
    items() 딕셔너리 내의 모든 항목을 [key]:[value] 쌍으로 반환한다.
    get(key) key에 대한 값을 반환한다. key가 없으면 None을 반환한다.
    pop(key) key에 대한 값을 반환하고, 그 항목을 삭제한다.
    popitem() 제일 마지막에 입력된 항목을 반환하고 그 항목을 삭제한다.
    clear() 딕셔너리 내의 모든 항목을 삭제한다.

    딕셔너리와 반복문

    리스트와 마찬가지로 딕셔너리도 반복문을 활용하여 효율적으로 딕셔너리를 다룰 수 있다.

    >>> for name, phone_num in phone_book.items():
      print(name,':', phone_num)
    
      
    홍길동 : 010-1234-5678
    강감찬 : 010-1234-5679
    이순신 : 010-1234-5680

    name에는 phone_book의 key, phone_num에는 phone_book의 value들이 튜플이 전달된다.

     

    이러한 강력한 자료형이 파이썬의 기본 자료형으로 제공되니 너무 편한 언어인것 같다.


    람다(lambda) 함수

    람다 함수는 이름이 없는 함수이다.

    함수를 만들지 않고 함수화된 기능만을 불러 사용하고자 할 경우에 편리하게 쓸 수 있다.

     

    사용법

    기본적인 람다 함수의 형태이다.

    lambda키워드를 사용한다.

    일반 함수와 람다 함수

    람다 함수를 정의하는 동시에 호출 하는 방법

    >>> x, y = 10, 20
    >>> (lambda x, y : x+ y)(x, y)
    30

    (x,  y)를 인자로 전달 받고 x + y 를 반환해준다.

     

    람다 함수에 이름을 붙이는 방법

    >>> x, y = 10, 20
    >>> lambda_function = lambda x, y : x+ y
    >>> lambda_function(x, y)
    30

    x, y를 받고 x + y를 반환해주는 lambda함수를 lambda_function으로 참조하고있다.

    lambda_function을 호출하며 x, y를 인자로 전달한다.

     

    이제 위에서 살펴봤던 딕셔너리의 메소드 sorted() 부분의 lambda 함수를 다시 보면 이해가 될것이다.


    집합(set)

    집합(set)은 순서가 없는 자료형이다.

    수학에서의 집합이랑 비슷한 성질을 가진다.

     

    집합 생성

    {} 중괄호를 이용하여 생성한다.

    numbers = {2, 1, 3}   # 숫자 3개로 이루어진 집합 자료형
    numbers

     

    set 키워드를 이용하여 생성할 수도 있다.

    >>> data_list = [1, 2, 3]
    >>> set(data_list)
    {1, 2, 3}

     

    중복되는 요소는 제거하여 생성한다.

    >>> data_list = [1, 2, 3, 3]
    >>> set(data_list)
    {1, 2, 3}

     

    문자열도 집합을 변형 가능하다. 물론 중복되는 요소는 제거하여 생성한다.

    >>> st = "hello"
    >>> set(st)
    {'h', 'o', 'l', 'e'}

     

    집합의 항목에 접근하는 연산

    리스트와 마찬가지로 in 연산자를 이용하여 어떤 항목이 집합 안에 있는지 검사할 수 있다.

    >>> numbers = {2, 1, 3}
    >>> if 1 in numbers:     # 1이라는 항목이 numbers 집합에 있는가 검사
    	print("집합 안에 1이 있습니다.")
    
        
    집합 안에 1이 있습니다.

     

    집합은 순서가 없기 때문에 인덱스를 가지고 접근할 수 없다.

    for 반복문을 이용하여 각 항목에 접근할 수 있다.

    >>> numbers = {2, 1, 3}
    >>> for x in numbers:
    	print(x, end=" ")
    
    	
    1 2 3 

    주의할 점은 출력되는 순서는 입력된 순서와 다를 수도 있다는 점이다.

    여기의 예제에서는 1 2 3 순서대로 출력 되었지만 다르게 출력 될 수도 있다.

     

    따라서 순서대로 출력하고싶다면 sorted()를 이용한다.

    >>> for x in sorted(numbers):
    	print(x, end=" ")
    
        
    1 2 3 

    집합에 사용할 수 있는 메소드

    add()

    집합의 요소를 추가한다.

    >>> numbers = {1, 2, 3}
    >>> numbers.add(4)
    >>> numbers
    {1, 2, 3, 4}

    remove()

    집합의 요소를 제거한다.

    >>> numbers.remove(4)
    >>> numbers
    {1, 2, 3}

     

    집합에 사용할 수 있는 함수

    사용법은 리스트와 비슷하다.

    >>> a_set = {1, 5, 4, 3, 7, 4 }    # 6개 항목으로 집합 생성
    >>> len(a_set)                     # 항목의 개수는 중복을 제외하면 5
    5
    >>> max(a_set)                     # 항목 가운데 가장 큰 수는 7
    7
    >>> min(a_set)                     # 항목 가운데 가장 작은 수는 1
    1
    >>> sorted(a_set)                  # 항목을 정렬하여 리스트 만든다. 중복은 제거
    [1, 3, 4, 5, 7]
    >>> sum(a_set)                     # 중복 원소는 하나만 사용되므로 전체 합은 20
    20
    >>> all(a_set), any(a_set)   # a_set이 모두 True인가?, a_set에 0이 있는가? 검사
    (True, True)

     

    집합 비교 연산

    비교 연산은 다음과 같이 한다.

    쉽다 쉽다!

    >>> A = {1, 2, 3, 4, 5}
    >>> B = {1, 2, 3}
    >>> A == B # A와 B가 같은지 검사
    False
    >>> B < A  # B가 A의 진부분 집합인가 검사
    True

    집합 연산

    아래 A, B 집합에대한 합집합, 차집합, 교집합, 대칭 차집합 연산을 해보자

    >>> A = {1, 2, 3}
    >>> B = {3, 4, 5}

    합집합

    >>> A | B    # 합집합 연산
    {1, 2, 3, 4, 5}
    >>> A.union(B)   # 합집합 메소드
    {1, 2, 3, 4, 5}

    차집합

    >>> A - B    # 차집합 연산
    {1, 2}
    >>> A.difference(B) # 차집합 메소드
    {1, 2}

    교집합

    >>> A & B    # 교집합 연산
    {3}
    >>> A.intersection(B) # 교집합 메소드
    {3}

    대칭 차집합

    대칭 차집합이 뭐였더라..

    위키 백과에서 공부하고 오자 ㅋ

    https://ko.wikipedia.org/wiki/%EB%8C%80%EC%B9%AD%EC%B0%A8

    >>> A ^ B    # 대칭 차집합 연산
    {1, 2, 4, 5}
    >>> A.symmetric_difference(B)	# 대칭 차집합 메소드
    {1, 2, 4, 5}

    파일 읽기

    파일을 쓰고 읽어오는 방법에 대해 공부해보자.

    파일 쓰기

    f = open('hello.txt', 'w')
    f.write('Hello World!')
    f.close()

    open() 명령을 통해서 'hello.txt' 파일을 연다. 경로는 현재 경로이다.

    다른 경로에 있을 경우 직접 경로를 써줘야한다.

    두번 째 인자는 'w'인데 쓰기 모드를 뜻한다.

    f.close()를 통해 파일을 닫는다.
    이 디렉토리(코드를 작성한 파일이 있는 곳)를 살펴보면 hello.txt 파일이 생성 된다.

    파일 읽기

    f = open('hello.txt', 'r')
    s = f.read()
    print(s)
    Hello World!
    f.close()

    open() 명령을 통해서 'hello.txt' 파일을 연다.

    두번 째 인자는 'r'인데 읽기 모드를 뜻한다.

    f.read()를 통해 파일의 내용을 읽어오고

    f.close()를 통해 파일을 닫는다.


    지금까지 배운 것들로

    최대 공약수를 구하는 프로그램

    집합을 이용하여 최대 공약수를 구해보자!!

    # num의 약수를 집합형으로 반환함
    def get_divisors(num):   
      divisors = set()
      for i in range(2, num):
        if num % i == 0:
          divisors.add(i)
      return divisors
    
    # 48과 60의 약수들을 구한다.
    x = 48
    print(x,'의 진약수 :', get_divisors(x))
    y = 60
    print(y,'의 진약수 :', get_divisors(y))
    
    # 48의 약수들을 A집합, 60의 약수들을 B집합으로 나타낸다.
    A = get_divisors(x)
    B = get_divisors(y)
    
    # A, B의 공약수를 구한다.
    print(A.intersection(B))
    
    # A, B의 최대공약수를 구한다.
    print(x, y,'의 최대공약수 :', max(A.intersection(B)))
    48 의 진약수 : {2, 3, 4, 6, 8, 12, 16, 24}
    60 의 진약수 : {2, 3, 4, 5, 6, 10, 12, 15, 20, 30}
    {2, 3, 4, 6, 12}
    48 60 의 최대공약수 : 12

    영한 사전을 만들어보자

    명령 프롬프트 '$'가 나타나며. 입력은 '<' 검색은 '>' 명령으로 한다.

    입력은 "영어 단어:우리말 단어" 형태로 한다.

    'q'를 입력하면 종료한다.

     

    print("사전 프로그램 시작... 종료는 q를 입력")
    dictionary = {}
    
    while True:
        st = input('$ ')
        command = st[0]     # 첫 입력 문자를 추출한다
        if command == '<':
            st = st[1:]
            inputStr = st.split(':')
            if len(inputStr) < 2 :
                print('입력 오류가 발생했습니다.')
            else:
                dictionary[inputStr[0].strip()] = inputStr[1].strip()
        elif command == '>':
            st = st[1:]
            inputStr = st.strip()
            if inputStr in dictionary:
                print(dictionary[inputStr])
            else :
                print('{}가 사전에 없습니다.'.format(inputStr))
        elif command == 'q':
           break
        else :
            print('입력 오류가 발생했습니다.')
    
    print("사전 프로그램을 종료합니다.")
    사전 프로그램 시작... 종료는 q를 입력
    $ < one:하나
    $ < two:둘
    $ < apple:사과
    $ > apple
    사과
    $ > one
    하나
    $ > two

    $ q
    사전 프로그램을 종료합니다.

     

    728x90

    'Deep Learning > 인공지능 입문 코딩' 카테고리의 다른 글

    [CHAPTER 10]넘파이(numpy)  (0) 2021.05.30
    [CHAPTER 9] 텍스트 처리  (0) 2021.05.29
    [CHAPTER 7] 리스트, 튜플  (0) 2021.05.23
    [CHAPTER 6] 함수  (0) 2021.05.22
    [CHAPTER 5] 반복문  (0) 2021.05.21

    댓글

Designed by Tistory.