logo
Search검색어를 포함하는 게시물들이 최신순으로 표시됩니다.
    Table of Contents
    [Python] 자료구조 - 리스트, 튜플

    이미지 보기

    [Python] 자료구조 - 리스트, 튜플

    • 22.01.04 작성

    • 읽는 데 12

    TOC

    참고 강의

    SWEA 파이썬 프로그래밍 기초(2) 파이썬의 기본 응용 #2


    시퀀스형

    데이터에 대해 순서를 가진 자료구조 총칭 ex) 리스트, 튜플


    리스트의 생성 및 조작법

    리스트

    • 대괄호 [] 안에 서로 다른 자료형의 값을 콤마(,)로 구분해 하나 이상 저장할 수 있는 컬렉션 자료형
    • 개별 항목은 0부터 시작하는 인덱스를 이용해 접근
    • 저장된 항목 변경 가능

    리스트 생성

    # 리스트의 literal = [ , , , ]
    data_list = [10, 21.5, "파이썬", True]
    print("{0} {1}".format(type(data_list), data_list))
    # <class 'list'> [10, 21.5, '파이썬', True]
    
    data_list = list(range(10, 21, 2))
    print("{0} {1}".format(type(data_list), data_list))
    # <class 'list'> [10, 12, 14, 16, 18, 20]
    
    data_str = "안녕하세요"
    data_list = list(data_str)
    print("{0} {1}".format(type(data_list), data_list))
    # <class 'list'> ['안', '녕', '하', '세', '요']
    

    리스트 항목 접근

    음수 인덱스

    N개의 원소라면 인덱스는 -N 부터 시작하여 -1로 끝남

    data_list = [10, 20, 30, 40, 50]
    
    print("data_list[-5] => {0}".format(data_list[-5]))
    print("data_list[-4] => {0}".format(data_list[-4]))
    print("data_list[-3] => {0}".format(data_list[-3]))
    print("data_list[-2] => {0}".format(data_list[-2]))
    print("data_list[-1] => {0}".format(data_list[-1]))
    
    [결과]
    data_list[-5] => 10
    data_list[-4] => 20
    data_list[-3] => 30
    data_list[-2] => 40
    data_list[-1] => 50
    

    index() 함수

    lst.index(element) 함수를 통해 element가 list 내에서 가지는 인덱스를 구할 수 있다.

    data_list = [10, 20, 30, 40, 50]
    
    print("data_list.index(20) => {0}".format(data_list.index(20)))
    
    
    [결과]]
    data_list.index(20) => 1
    

    리스트 기본 연산

    data_list1, data_list2 = [10, 20, 30], [40, 50]
    
    # 리스트의 덧셈 : 결합
    print("{0} + {1} => {2}\n".format(data_list1,
          data_list2, data_list1 + data_list2))
    # [10, 20, 30] + [40, 50] => [10, 20, 30, 40, 50]
    
    
    # 리스트의 곱셈 : 반복
    print("{0} * 2 => {1}\n".format(data_list1, data_list1 * 2))
    print("{0} * 3 => {1}\n".format(data_list2, data_list2 * 3))
    # [10, 20, 30] * 2 => [10, 20, 30, 10, 20, 30]
    # [40, 50] * 3 => [40, 50, 40, 50, 40, 50]
    

    리스트 항목 추가

    append() 함수

    맨 뒤에 element를 이어붙인다. list.append(element)의 형식으로 사용한다.

    data_list = [10, 20, 30, 40]
    
    print("data_list: {0}".format(data_list))
    
    data_list.append(50)
    data_list.append(60)
    
    print("data_list: {0}".format(data_list))
    
    
    [결과]
    data_list: [10, 20, 30, 40]
    data_list: [10, 20, 30, 40, 50, 60]
    

    insert() 함수

    원하는 인덱스의 자리에 element를 삽입한다. list.insert(index, element)의 형식으로 사용한다.

    data_list = [10, 20, 30, 40]
    
    data_list.insert(2, 25)
    print("data_list: {0}".format(data_list))
    
    
    [결과]
    data_list: [10, 20, 25, 30, 40]
    

    extend() 함수

    append() 함수와 같이 리스트의 맨 뒤에 원소를 이어 붙인다. 하지만 큰 차이점은 시퀀스 객체를 괄호 안에 넣었을 때, extend()는 하나하나 리스트에 집어넣지만, append()는 그 자체를 하나의 원소로 간주하여 집어넣는다는 것이다.

    data_list = [10, 20, 30, 40]
    
    data_list.extend([70, 80])
    data_list.append([90, 100])
    print("data_list: {0}".format(data_list))
    
    
    [결과]
    data_list: [10, 20, 30, 40, 70, 80, [90, 100]]
    

    리스트 항목 변경

    # 1. 인덱스 지정
    data_list = [10, 20, 30, 40]
    
    data_list[2] = 29
    print("data_list: {0}".format(data_list))
    # [결과] data_list = [10, 20, 29, 40]
    
    
    # 2. 인덱스 범위 지정
    data_list = [10, 20, 30, 40]
    
    data_list[1:3] = [12, 15]   # 범위 연산자의 마지막 값(3)은 실제 범위에 미포함
    print("data_list: {0}".format(data_list))
    # [결과] data_list: [10, 12, 15, 40]
    
    
    # 3. 인덱스 범위가 다를 때
    data_list = [10, 20, 30, 40]
    
    data_list[1:3] = [12, 15, 20]   # 범위 연산자의 마지막 값(3)은 실제 범위에 미포함
    print("data_list: {0}".format(data_list))
    # [결과] data_list: [10, 12, 15, 20, 40] -> 전체 리스트의 크기가 변경
    

    리스트 항목 제거

    • del lst[idx] : 특정 원소를 인덱스를 찾아 제거
    • lst.pop(idx) : 특정 원소를 인덱스를 통해 찾아 제거
    • remove(element) : 특정 원소를 값을 통해 찾아 제거
    • lst.clear() : 모든 원소 제거해 빈 리스트 생성
    data_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
    
    del data_list[2]
    print("data_list: {0}".format(data_list))
    # [결과] data_list: [10, 20, 40, 50, 60, 70, 80, 90, 100]
    # data_list[2] : 30 제거
    
    del data_list[3:5]
    print("data_list: {0}".format(data_list))
    # [결과] data_list: [10, 20, 40, 70, 80, 90, 100]
    # data_list[3:5] : 3번, 4번인 50, 60 제거
    
    data_list.pop(5)
    print("data_list: {0}".format(data_list))
    # [결과] data_list: [10, 20, 40, 70, 80, 100]
    
    data_list.remove(100)
    print("data_list: {0}".format(data_list))
    # [결과] data_list: [10, 20, 40, 70, 80]
    
    data_list.clear()
    print("data_list: {0}".format(data_list))
    # [결과] data_list: []
    

    리스트 항목 확인

    element in list로 검사 반대로 없는지 확인하려면 not in을 이용한다.

    data_list = [10, 20, 30, 50, 50, 50, 60, 70, 80]
    
    print("50 in data_list => {0}".format(50 in data_list))
    print("50 not in data_list => {0}".format(50 not in data_list))
    print("data_list.count(50) => {0}".format(data_list.count(50)))
    print("data_list.count(55) => {0}".format(data_list.count(55)))
    
    
    [결과]
    50 in data_list => True
    50 not in data_list => False
    data_list.count(50) => 3
    data_list.count(55) => 0
    

    리스트와 for문

    data_list = list(range(0, 11, 2))
    
    for item in data_list:
        print("{0}".format(item), end = " ")    # 반복문을 수행하는 동안 항목이 가로로 출력
    
    print()
    
    for idx, item in enumerate(data_list):
        print("data_list[{0}] => {1}".format(idx, item))
    
    
    [결과]
    0 2 4 6 8 10
    data_list[0] => 0
    data_list[1] => 2
    data_list[2] => 4
    data_list[3] => 6
    data_list[4] => 8
    data_list[5] => 10
    

    리스트 내포의 특징

    data_list1 = [1, 2, 3, 4, 5]
    print("data_list1: {0} {1}".format(type(data_list1), data_list1))
    # [결과] data_list1: <class 'list'> [1, 2, 3, 4, 5]
    
    
    data_list2 = []
    for item in data_list1:
        data_list2.append(item)
    
    print("data_list2: {0} {1}".format(type(data_list2), data_list2))
    # [결과] data_list2: <class 'list'> [1, 2, 3, 4, 5]
    
    
    # 반복 가능한 자료형의 경우 literal 안에서 for문을 사용하면 내포 기능 사용 가능
    data_list3 = [item for item in data_list1]
    print("data_list3: {0} {1}".format(type(data_list3), data_list3))
    # [결과] data_list3: <class 'list'> [1, 2, 3, 4, 5]
    
    
    data_list4 = []
    for item in data_list1:
        if item % 2 == 1:
            data_list4.append(item)
    print("data_list4: {0} {1}".format(type(data_list4), data_list4))
    # [결과] data_list4: <class 'list'> [1, 3, 5]
    
    
    # list literal 안에서 for문 사용
    data_list5 = [item for item in data_list1 if item % 2 == 1]
    print("data_list5: {0} {1}".format(type(data_list5), data_list5))
    # [결과] data_list5: <class 'list'> [1, 3, 5]
    
    
    data_list6 = [item for item in data_list1 if item % 2 == 0]
    print("data_list6: {0} {1}".format(type(data_list6), data_list6))
    # [결과] data_list6: <class 'list'> [2, 4]
    
    
    data_list7 = []
    for x in data_list1:
        if x % 2 == 1:  # x = [1, 3, 5]
            for y in data_list1:
                if y % 2 == 0:  # y = [2, 4]
                    data_list7.append(x * y)    # 각각 곱셈 연산한 것을 append
    print("data_list7: {0} {1}".format(type(data_list7), data_list7))
    # [결과] data_list7: <class 'list'> [2, 4, 6, 12, 10, 20]
    
    
    data_list8 = [x * y for x in data_list1 if x % 2 == 1
                        for y in data_list1 if x % 2 == 0]
    print("data_list8: {0} {1}".format(type(data_list8), data_list8))
    # [결과] data_list8: <class 'list'> [2, 4, 6, 12, 10, 20]
    
    
    data_str = "Hello, Python!"
    data_list9 = [item.lower() for item in data_str]
    # [해석] data_list9는 data_str의 각 항목에 대해 소문자화 한 항목들의 리스트이다.
    print("data_list9: {0} {1}".format(type(data_list9), data_list9))
    # [결과] data_list9: <class 'list'> ['h', 'e', 'l', 'l', 'o', ',', ' ', 'p', 'y', 't', 'h', 'o', 'n', '!']
    

    튜플의 생성 및 조작법

    튜플

    • 소괄호() 안에 서로 다른 자료형의 값을 콤마(,)로 구분해 하나 이상 저장할 수 있는 컬렉션 자료형
    • 개별 항목은 0부터 시작하는 인덱스를 이용해 접근
    • 저장된 항목 변경 불가
    data_tuple = (10, 21.5, "파이썬", True)
    print("{0} {1}".format(type(data_tuple), data_tuple))
    # [결과] <class 'tuple'> (10, 21.5, '파이썬', True)
    
    
    data_tuple = tuple(range(10, 21, 2))
    print("{0} {1}".format(type(data_tuple), data_tuple))
    # [결과] <class 'tuple'> (10, 12, 14, 16, 18, 20)
    
    data_str = "안녕하세요"
    data_tuple = tuple(data_str)
    print("{0} {1}".format(type(data_tuple), data_tuple))
    # [결과] <class 'tuple'> ('안', '녕', '하', '세', '요')
    

    튜플 항목 접근

    대부분 리스트와 비슷하여 생략한다.


    실습

    리스트 객체를 활용해 총점과 평균 구하기

    문제

    [결과1] 총 학생 수를 입력하세요: 3 학생1의 국어 점수를 입력하세요: 100 학생1의 수학 점수를 입력하세요: 90 학생1의 영어 점수를 입력하세요: 80 학생2의 국어 점수를 입력하세요: 90 학생2의 수학 점수를 입력하세요: 88 학생2의 영어 점수를 입력하세요: 96 학생3의 국어 점수를 입력하세요: 88 학생3의 수학 점수를 입력하세요: 75 학생3의 영어 점수를 입력하세요: 78 학생1 => 총점 : 270, 평균 : 90.00 학생2 => 총점 : 274, 평균 : 91.33 학생3 => 총점 : 271, 평균 : 80.33


    나의 Sol

    # -*- coding: utf-8 -*-
    # calcSumAvgScores.py
    
    num_total = int(input("총 학생 수를 입력하세요: "))
    total = []
    avg = []
    
    for i in range(0, num_total):
        score_kor = int(input("학생{0}의 국어 점수를 입력하세요: ".format(i + 1)))
        score_math = int(input("학생{0}의 수학 점수를 입력하세요: ".format(i + 1)))
        score_eng = int(input("학생{0}의 영어 점수를 입력하세요: ".format(i + 1)))
    
        score_total = score_kor + score_math + score_eng
        score_avg = score_total / 3
    
        total.append(score_total)
        avg.append(score_avg)
    
    
    for i in range(0, num_total):
        print("학생{0} => 총점 : {1}, 평균 : {2:.2f}".format(i + 1, total[i], avg[i]))
    

    모범 답안

    # -*- coding: utf-8 -*-
    # calcSumAvgScores.py
    
    scores = []
    
    count = int(input("총 학생 수를 입력하세요: "))
    
    for i in range(1, count + 1):
        score = []
    
        kor = int(input("학생{0}의 국어 점수를 입력하세요: ".format(i)))
        score.append(kor)
    
        math = int(input("학생{0}의 수학 점수를 입력하세요: ".format(i)))
        score.append(math)
    
        eng = int(input("학생{0}의 영어 점수를 입력하세요: ".format(i)))
        score.append(eng)
    
        scores.append(score)
    
    for i, score in enumerate(scores):
        total = 0
        for s in score:
            total += s
        print("학생{0} => 총점: {1}, 평균: {2:0.2f}".format(
            i + 1, total, total / len(score)))
    
    profile

    FE Developer 박승훈

    노력하는 자는 즐기는 자를 이길 수 없다