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)))