본문 바로가기
공부 목록/IT & 프로그래밍

Python Data Structure - 리스트(List) 관련 내용 정리

by 독학박사 2022. 5. 29.

목차


    여러 다른 프로그래밍 언어와 python과의 가장 큰 차이는 바로 리스트(list)라고 해도 과언이 아닐 것이다. C언어와 matlab을 주로 사용했던 나에게도 python의 리스트는 정말 신세계를 만들 수 있는 치트키였다. 최근 데이터 분석에 많이 이들이 파이썬을 사용하고 있는데, 데이터 분석 라이브러리가 많은 탓도 있겠지만 리스트라는 재주꾼이 있어 분석툴을 한 층 더 독보이게 하기 때문일 것이다. 오늘은 왜 리스트가 대단한지 간단히 설명하고 리스트를 활용하는 방법에 대해 다뤄보겠다.

     

    1. Python의 데이터 구조(data structure) 종류

     파이썬에는 데이터 활용 방식에 따라 여러 형태로 데이터를 저장할 수 있으며, 이를 데이터 구조라고 한다. 데이터 구조에는 다음과 같이 4개의 종류가 있다. 금일 포스팅에서는 리스트에 대해 알아보고자 한다.

     

     리스트형 : List type

     튜플형 : Typle type

     세트형 : Set type

     사전형 : Dictionary type

     

     

    2. 리스트가 특별한 이유

     일반적인 프로그래밍 언어에서 데이터를 저장하는 변수는 같은 종류의 데이터만 취급하게 된다. Matlab과 C언어에서는 행렬 개념으로 사용되고 있으나 같은 종류의 데이터를 저장해야 한다. 파이썬의 리스트는 어떠한 데이터형이라도 저장이 가능하다. 아래 코드를 확인해 보자.

     

    list_special = ['List', 100, 3.5, pd.DataFrame(columns=['A', 'B', 'C']), [1, 2, 'special']]

    리스트 내 여러타입 데이터
    list_special 내용 확인

     'list_special'이라는 리스트 변수에 문자열, int, float, 데이터 프레임, 리스트까지 넣어봤다. 이처럼 어떤 종류라도 저장이 가능한 특성은 데이터 분석에서 그 빛을 발한다.

     

    3. 리스트 사용법

     파이썬으로 데이터 분석하기에 리스트의 특성을 살펴봤다. 리스트의 특성을 제대로 살리기 위해서는 리스트의 기능들을 확실히 이해해야 한다. 

     

    3-1. 리스트 정의와 색인 방법

     리스트의 정의는 리스트 변수에 '[, ]'를 사용하여 값을 바로 넣는 방식이 있고 빈 리스트를 만들어 추가해 주는 방식이 있다. 또한, for 문을 이용한 리스트 생성 방식도 있다. 가장 간단한 방법은 리스트가 특별한 이유 절에 설명한 코드를 확인하면 된다. 빈 리스트를 만들고 그 안에 데이터를 넣는 방식은 여러 개의 파일을 불러올 때 유용하게 사용된다.

     엑셀파일 하나로 합치기에 정리된 코드를 다시 적어봤다. file_path와 file_name을 확인하고 각각의 파일을 데이터 프레임으로 읽어와서 한 개 한 개의 데이터 프레임을 data_list에 추가해 주는 방식이다.

     

    file_path = '.\\data\\'
    file_name = os.listdir(file_path)
    data_list = []
    for fn in file_name:
            data_list.append(pd.read_excel(file_path + fn))

     

     for 문을 이용하여 리스트를 작성하는 방식은 아래와 같다. for_list 는 0~9까지의 값을 갖는 리스트가 생성되고, even_list는 if문을 사용하여 짝수만 갖는 리스트가 만들어진다.

     

    for_list = [x for x in range(10)]
    even_list = [x for x in range(10) if x%2==0]

     

     위와 같이 리스트에 저장을 했다면 필요 시에는 알맞은 값들을 꺼내서 쓸 줄 알아야 한다. 꺼내서 쓴다는 말은 리스트에 저장한 여러 개의 데이터 중에 특정값을 호출하는 방식을 알아야 한다는 의미다. 아래 그림에서 양수색인과 음수색인의 인덱스를 표기했다. 1~5까지 정수값을 갖는 리스트의 변수명이 Number 라고 할 때 Number[4] 와 Number[-1]은 리스트 값 중 '5'를 호출하게 된다.  색인 인덱스에 값을 한 개만 사용할 때는 정확히 그 값을 불러오지만 콜론(:)을 이용한 호출은 뒤쪽 숫자에서 왼쪽으로 한 칸 이동한 값까지만 갖고 온다. Number[1:-2]와 같이 색인하게 되면 [2, 3]를 호출한다.

     

    리스트 색인 원리
    리스트 색인 번호

     음수색인의 경우 리스트가 문자열을 다룰 때 유용하게 쓰인다. file_name이라는 변수가 'ABCD.xlsx'이라는 값을 갖는다 가정하자. file_name은 리스트는 아니지만 문자열의 값은 리스트 색인과 같이 불러올 수 있다. 이때 파일 확장자를 제외한 이름만을 사용하고 싶을 때 file_name[:-5]를 사용하면 '.xlsx'를 제외한 'ABCD'만 읽어 온다.

     

    3-2. 리스트의 함수들

     리스트의 주요 함수에는 append, insert, remove, pop 이 있다. test = [1, 2, 3, 4]라는 리스트가 있다고 가정할 때

    - append : 리스트 맨 뒤쪽으로 값 추가, test.append(5) → 결과 :  [1, 2, 3, 4, 5]

    - insert : 리스트 내 원하는 위치에 값 삽입, test.insert(1, 5) → 결과 :  [1, 5, 2, 3, 4]

    - remove : 리스트 내 원하는 위치에 값 삭제, test.remove(1) → 결과 :  [1, 3, 4]

    - pop : 원하는 위치의 값을 반환 후 리스트에서 값 삭제

    test_pop = test.pop(2) → 결과 :  test_pop 은 3의 값이 입력되고, test는 [ 1, 2, 4] 만 존재.

     

    3-3. 리스트 복사

     test를 copy_test 변수에 복사를 하기 위해 copy_test = test 라고 코딩하게 된다면 copy_test에서의 리스트 변경이 test에도 영향을 미치게 된다. copy_test = test는 test의 메모리 어드레스를 copy_test에 알려주고 같이 사용하기 때문이다. 신규 어드레스를 생성하고 그 안에 값을 복사를 해야 두 개 리스트가 값을 공유하지 않게 된다. 해당 방법은 아래와 같다.

     

    copy_test = test[:]

     

    3-4. 리스트 연산

    a = [1, 2, 3], b =[2, 3, 4] 두 개의 리스트가 있을 때 a + b 를 하게 되면 [3, 5, 7]라는 결과 대신 [1, 2, 3, 4, 5, 6]로 더해진다. 리스트에서 사칙연산은 요소에 영향을 미치는 것이 아니라 리스트 자체를 조작하게 된다. 또한, '-'와 '/'는 사용할 수 없다. 우선 아래 코드를 확인해 보자

     

    a = [1, 2, 3]
    b = [2, 3, 4]
    c = a + b
    d = a *2

     

    c는 [1, 2, 3, 2, 3, 4] 가 될 것이고, d는 [1, 2, 3, 1, 2, 3]으로 a+a 가 된다. 만일 a와 b의 요소들끼리의 연산을 하고 싶다면 아래 코드와 같이 for문을 이용하여 한 개씩 호출하여 연산해야 된다.

     

    e = [a[i]+b[i] for i in range(len(a))]

     

     

    4. 마치며

     파이썬의 데이터 구조 중에서 가장 중요한 리스트에 대해 정리해 보았다. 물론 튜플, 사전, 세트형들도 쓰이긴 하지만 데이터 분석에서는 리스트를 가장 많이 사용하기 때문에 제일 처음으로 리스트에 대한 포스팅을 해 봤다.

    댓글