ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 기본 자료구조 - 리스트/튜플/딕셔너리
    파이썬 2017. 11. 17. 14:35

    1)리스트


    -리스트 생성


    >>> interest1 = "삼성전자" >>> interest2 = "LG전자" >>> interest3 = "네이버"



    지금과 같은 방식에서는 관심 종목의 수가 100개라면 이를 표현하기 위해 interest1, interest2, interest3, …, interest100과 같이 100개의 변수명을 사용해야 할 것입니다.



    interest = ["삼성전자", "LG전자", "네이버"]



    다음 코드는 [0], [1], [2]라는 인덱스 값을 통해 interest 리스트에 있는 첫 번째, 두 번째, 세 번째 관심 종목 데이터를 차례대로 얻어옵니다.


    >>> interest = ["삼성전자", "LG전자", "네이버"] >>> interest[0] '삼성전자' >>> interest[1] 'LG전자' >>> interest[2] '네이버'


    그렇다면 리스트는 언제 사용하는 것이 좋을까요? 바로 여러 개의 데이터를 '순서대로' 저장하고 이를 관리해야 할 때입니다.


    >>> daishin = [9130, 9150, 9150, 9300, 9400]

    >>> daishin = [9130.0, 9150.0, 9150.0, 9300.0, 9400.0]

    >>> mystock = ['Naver', 5000]

    >>> mystock = []



    -리스트 인덱싱


    파이썬 리스트의 인덱스 값을 통해 리스트가 가리키고 있는 값에 접근할 수 있습니다. 리스트의 인덱스 역시 문자열 인덱스처럼 0부터 시작합니다.


    >>> buy_list = ['Naver', 5000] >>> buy_list[0] ‘Naver’ >>> buy_list[1] 5000


    지금까지 살펴본 것처럼 파이썬 리스트의 인덱싱은 문자열 인덱싱과 동일합니다. 2장의 문자열 인덱싱에서 배운 것처럼 인덱싱 값으로 음수를 사용하면 리스트의 뒤쪽부터 데이터에 접근할 수 있습니다. 단, 음수를 사용할 때는 -1부터 사용할 수 있습니다. 왜냐하면, 0은 이미 리스트의 맨 앞에 있는 데이터를 의미하기 때문입니다


    >>> daishin = [9130, 9150, 9150, 9300, 9400] >>> daishin[-1] 9400 >>> daishin[-2] 9300 >>> daishin[-3] 9150 >>> daishin[-4] 9150 >>> daishin[-5] 9130



    -리스트 슬라이싱


    >>> kospi_top10 = ['삼성전자', 'SK하이닉스', '현대차', '한국전력', '아모레퍼시픽', '제일모직', '삼성전자우', '삼성생명', 'NAVER', '현대모비스']

    >>> print("시가총액 5위: ", kospi_top10[4]) 시가총액 5위: 아모레퍼시픽

    >>> kospi_top10[5:10] ['제일모직', '삼성전자우', '삼성생명', 'NAVER', '현대모비스']

    >>> kospi_top10[:5] ['삼성전자', 'SK하이닉스', '현대차', '한국전력', '아모레퍼시픽']

    >>> kospi_top10[5:9] ['제일모직', '삼성전자우', '삼성생명', 'NAVER'] >>> kospi_top10[5:-1] ['제일모직', '삼성전자우', '삼성생명', 'NAVER']



    -리스트 데이터 삽입


    1.append

    기존의 리스트에 새로운 데이터를 삽입하려면 append 메서드를 사용하면 됩니다.append 메서드는 데이터를 리스트의 끝에 추가합니다. 


    >>> kospi_top10.append('SK텔레콤')


    이제 kospi_top10이라는 변수는 시가총액 상위 11개 종목이 담긴 리스트를 바인딩하고 있으므로 kospi_top10이라는 변수명은 적절하지 않습니다.


    >>> kospi_top11 = kospi_top10



    2.insert

    두 번째 방법은 insert라는 이름의 메서드를 사용하는 것입니다.

    insert 메서드는 사용자가 원하는 위치에 데이터를 삽입할 수 있기 때문입니다.


    >>> kospi_top10 = ['삼성전자', 'SK하이닉스', '현대차', '한국전력', '아모레퍼시픽', '제일모직', '삼성전자우', '삼성생명', 'NAVER', '현대모비스'] >>> kospi_top10.insert(3, 'SK 텔레콤')

    >>> kospi_top10 ['삼성전자', 'SK하이닉스', '현대차', 'SK 텔레콤', '한국전력', '아모레퍼시픽', '제일모직', '삼성전자우', '삼성생명', 'NAVER', '현대모비스']



    -리스트 데이터 삭제


    참고로 내장 함수라는 것은 파이썬에서 기본적으로 제공하는 함수라는 의미입니다. 일상생활에서 '빌트인'이라는 용어를 사용하곤 하는데, 그 '빌트인'이 여기서 사용하는 단어와 같은 의미입니다. len이라는 내장 함수는 length라는 영어 단어의 줄임말이며, 리스트뿐만 아니라 문자열의 길이를 확인할 때도 사용할 수 있습니다.


    >>> len(kospi_top10) 11

    >>> kospi_top10[-1] '현대모비스' >>> del kospi_top10[-1] >>> kospi_top10 ['삼성전자', 'SK하이닉스', '현대차', 'SK 텔레콤', '한국전력', '아모레퍼시픽', '제일모직', '삼성전자우', '삼성생명', 'NAVER'] >>> len(kospi_top10) 10



    2)튜플

    -기본

    3.1절에서는 파이썬의 리스트라는 자료구조를 배웠습니다. 이번 절에서 배울 튜플(tuple)도 여러 개의 데이터를 순서대로 담아두는 데 사용합니다. 단, 튜플과 리스트는 다음과 같은 두 가지 차이점이 있습니다.

    1) 리스트는 '['']'를 사용하는 반면 튜플은 '('')'를 사용한다. 
    2) 리스트는 리스트 내의 원소를 변경할 수 있지만 튜플은 변경할 수 없다. 
    

    사실 파이썬의 튜플은 리스트에 있는 여러 기능이 빠져 있고, 반대로 리스트는 튜플이 지원하는 모든 기능을 포함하고 있으므로 튜플을 사용하지 않고 리스트라는 자료구조만 사용해도 프로그래밍하는 데 전혀 불편함이 없습니다. 다만 튜플은 리스트보다 속도가 빠르다는 장점이 있습니다. 따라서 한번 데이터를 저장해둔 후 추가하거나 삭제할 필요가 없는 경우라면 되도록 리스트보다는 튜플을 사용하는 것이 좋습니다. 먼저 튜플을 하나 만들어 봅시다.

    >>> t = ('Samsung', 'LG', 'SK') >>> t ('Samsung', 'LG', 'SK')


    튜플은 리스트와 달리 원소를 수정할 수 없으므로 원소의 내용을 바꾸려고 하면 에러가 발생합니다.


    >>> len(t) 3 >>> t[0] 'Samsung' >>> t[1] 'LG' >>> t[2] 'SK' >>> t[0] = "Naver" Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> t[0] = "Naver" TypeError: 'tuple' object does not support item assignment


    -튜플 슬라이싱

    >>> t ('Samsung', 'LG', 'SK') >>> t[0:2] ('Samsung', 'LG')


    여기서 한 가지 주의할 점은 튜플을 생성할 때는 '('와 ')' 기호를 사용하지만 데이터에 접근하는 인덱싱이나 슬라이싱에서는 데이터의 범위를 '['와 ']' 기호로 표현한다는 점입니다.다음 코드는 파이썬 문법에 어긋나기 때문에 에러가 발생합니다.


    >>> t(0:2) SyntaxError: invalid syntax



    3)딕셔너리


    영어사전과 유사하게 키(key)와 값(value)이라는 쌍으로 데이터를 구성해서 저장함으로써 더 쉽게 저장된 값을 찾을 수 있는 구조입니다. 

    파이썬의 딕셔너리는 리스트와 튜플과 달리 인덱싱을 지원하지 않습니다. 딕셔너리는 리스트와 튜플과 달리 데이터를 순서대로 저장하는 것이 아니라 키와 값의 쌍이 서로 연결되도록만 저장하기 때문입니다. 따라서 다음과 같이 딕셔너리에 정숫값을 이용해 인덱싱하면 오류가 발생합니다.


    딕셔너리는 '{'와 '}' 기호를 사용합니다.


    >>> cur_price = {}

    >>> type(cur_price) <class 'dict'>


    원소가 들어 있지 않은 딕셔너리가 잘 만들어졌으니 딕셔너리에 키-값 쌍을 하나 추가해보겠습니다. 대신증권의 '현재가'가 30,000원이라고 하면 다음과 작성하면 됩니다. 여기서 'daeshin'이 키고 30000이 값이 됩니다.



    >>> cur_price['daeshin'] = 30000


    >>> cur_price {'daeshin': 30000}


    >>> cur_price['Daum KAKAO'] = 80000 >>> cur_price {'Daum KAKAO': 80000, 'daeshin': 30000}



    -딕셔너리 데이터 추가


    >>> cur_price['daeshin'] 30000 >>> cur_price['Daum KAKAO'] 80000 >>>


    >>> cur_price = {'Daum KAKAO': 80000, 'naver':800000, 'daeshin':30000}



    -딕셔너리 데이터 삭제


    del cur_price['daeshin']



    -딕셔너리 키 구하기

    딕셔너리에 있는 키 값만 구하려면 어떻게 해야 할까요? 이를 위해 파이썬의 딕셔너리는 keys()라는 메서드를 제공합니다. 따라서 키 값만 구하고 싶을 때 "딕셔너리이름.keys()"라고 호출하면 됩니다.


    >>> cur_price = {'Daum KAKAO': 80000, 'naver':800000, 'daeshin':30000} >>> cur_price.keys() dict_keys(['naver', 'Daum KAKAO', 'daeshin'])


    리스트로 바인딩하기


    >>> stock_list = list(cur_price.keys()) >>> stock_list ['naver', 'Daum KAKAO', 'daeshin']



    -딕셔너리 값 구하기

    딕셔너리에서 키 목록을 구하는 것과 비슷하게 값 목록을 구하려면 values()라는 메서드를 사용하면 됩니다. cur_price 딕셔너리에서 값 목록을 리스트로 만들어 바인딩해 봅시다.


    >>> price_list = list(cur_price.values()) >>> price_list [800000, 80000, 30000]





    'Samsung'이라는 종목의 현재가를 cur_price라는 딕셔너리로부터 구해야 한다고 해봅시다. 이를 위해서는 앞서 이야기한 것처럼 먼저 'Samsung'이라는 키 값이 cur_price 딕셔너리에 있는지 확인해야 합니다. 딕셔너리의 키 값은 keys() 메서드를 통해 얻을 수 있었죠? 다음과 같이 in 이라는 키워드와 keys() 메서드의 반환값을 이용하면 이를 쉽게 조회할 수 있습니다.



    >>> 'Samsung' in cur_price.keys() False >>>

    >>> 'naver' in cur_price.keys() True

    >>> cur_price['naver'] 800000 >>> cur_price['Samsung'] Traceback (most recent call last): File "<pyshell#40>", line 1, in <module> cur_price['Samsung'] KeyError: 'Samsung'




    연습문제

    문제 3-1

    >>> naver_end_price = [474500, 461500, 501000, 500500, 488500]
    >>> naver_end_price
    [474500, 461500, 501000, 500500, 488500]
    >>>
    

    문제 3-2

    >>> max_price = max(naver_end_price)
    >>> print(max_price)
    501000
    >>>
    

    문제 3-3

    >>> min_price = min(naver_end_price)
    >>> print(min_price)
    461500
    >>>
    

    문제 3-4

    >>> naver_end_price = [474500, 461500, 501000, 500500, 488500]
    >>> max_price = max(naver_end_price)
    >>> min_price = min(naver_end_price)
    >>> print("가격차: ", max_price - min_price)
    가격차: 39500
    >>>
    

    문제 3-5

    >>> print("수요일 종가: ", naver_end_price[2])
    수요일 종가:  501000
    >>>
    

    문제 3-6

    >>> naver_end_price2 = {'09/07':474500, '09/08':461500, '09/09':501000, '09/10': 500500, '09/11':488500}
    >>> naver_end_price2
    {'09/09': 501000, '09/11': 488500, '09/08': 461500, '09/10': 500500, '09/07': 474500}
    >>> 
    

    문제 3-7

    >>> print(naver_end_price2['09/09'])
    501000
    >>>