예를 들어 학생 10명의 성적 평균을 계산한다고 가정합시다. 평균을 계산하려면 먼저 각 학생들의 성적을 읽어 어딘가에 저장해야 합니다.
데이터를 저장할 수 있는 곳은 변수입니다. 학생이 10명이므로 10개의 변수가 필요합니다.
s0 = 32
s1 = 56
s2 = 41
...
s9 = 19
만약 학생이 30명이라면 어떻게 해야 할까요? 위의 방법대로라면 30개의 정수 변수를 생성하고 성적을 저장해야 합니다.
그렇다면 만약 100명, 아니 10,000명이라면 어떻게 해야할까요? 변수를 일일히 생성하는 것은 힘드므로 다른 방법이 필요합니다.
쉽게 대량의 데이터를 저장할 수 있는 공간을 만들 수 있어야 하고 이들 데이터들을 손쉽게 처리할 수 있는 방법이 필요합니다.
그래서 탄생하게 된 것이 리스트입니다. 리스트를 사용하면 대량의 데이터를 효율적이고 간편하게 처리할 수 있습니다.
리스트(list)는 여러 개의 데이터가 저장되어 있는 장소입니다. 리스트는 다음과 같이 [ ] 안에 값을 나열하면 생성됩니다.
리스트 = [ 값1, 값2, ... ]
예를 들어 10개의 정수를 저장하고 있는 리스트를 생성하면 아래와 같습니다.
scores = [32, 56, 64, 72, 12, 37, 98, 77, 59, 69]
초기값이 있으면 위와 같이 생성하면 되지만 공백 리스트를 생성한 후에 사용자로부터 값을 받아 리스트에 추가하려면 append() 메소드를 사용합니다.
scores = []
for i in range(10):
scores.append(int(input("성적을 입력하시오 : ")))
print(scores)
<실행 결과>
성적을 입력하시오 : 32
성적을 입력하시오 : 56
성적을 입력하시오 : 64
성적을 입력하시오 : 72
성적을 입력하시오 : 12
성적을 입력하시오 : 38
성적을 입력하시오 : 98
성적을 입력하시오 : 77
성적을 입력하시오 : 59
성적을 입력하시오 : 69
[32, 56, 64, 72, 12, 38, 98, 77, 59, 69]
특히 리스트가 꼭 필요한 경우는 서로 관련된 데이터를 차례로 접근하여 처리하고 싶은 경우입니다.
만약 관련된 데이터들이 서로 다른 이름을 사용하고 있다면 이들 이름을 일일이 기억해야 할 것입니다.
그러나 하나의 이름을 공유하고 단지 번호만 다를 뿐이라면 아주 쉽게 기억할 수 있고 편리하게 사용할 수 있습니다.
리스트는 근본적으로 데이터들 각각에 이름을 붙이지 않고 전체 집단에 하나의 이름을 부여하고, 숫자 번호를 통해 각각의 데이터에 접근합니다.
파이썬에서는 다양한 종류의 데이터를 하나의 리스트 안에 함께 저장할 수 있습니다.
myList = [1, "computer", 3.4]
myList = ["apple", [8, 4, 6]]
파이썬의 리스트는 다른 언어의 배열(array)와 유사합니다. 하지만 배열의 크기는 고정되어 있는 반면에 리스트의 크기는 가변적입니다.
즉 요소의 개수에 따라서 커지거나 작아질 수 있습니다. 또 배열은 한 가지 종류의 데이터만 저장할 수 있지만 리스트에는 다양한 종류의 데이터를 섞어서 저장할 수 있습니다.
파이썬의 리스트가 배열보다 훨씬 사용하기 편합니다.
앞에서 리스트를 어떻게 생성하는지를 살펴보았습니다. 르스트에 저장된 데이터들을 리스트 요소(array element)라고 합니다.
그렇다면 리스트 요소들은 어떤 식으로 접근해야 할까요? 리스트의 요소에는 번호가 붙어 있는데 이것을 인덱스(index)라고 부릅니다.
리스트의 이름을 쓰고 괄호 [] 안에 번호를 표시하면 리스트 요소가 됩니다.
예를 들어 리스트의 이름이 scores라면 리스트 요소는 scores[0], scores[1], scores[2], ... , scores[9] 으로 표시됩니다.
scores 리스트에서 번호가 5인 요소에 접근하려면 scores[5]와 같이 적어주면 됩니다.
scores[5] = 80
유효한 인덱스의 범위는 0에서 (리스트 크기 - 1)까지입니다. 크기가 100인 scores 리스트에서
...
리스트 요소는 변수와 100% 동일합니다. 리스트 요소에 값을 저장할 수 있고 리스트 요소에 저장된 값을 꺼낼 수도 있습니다.
scores[0] = 80 # 0번째 요소에 80을 저장합니다.
scores[1] = scores[0] # 0번째 요소의 값을 1번째 요소로 복사합니다.
변수나 수식도 인덱스로 사용할 수 있습니다.
scores[i] = 10 # i 번째 요소에 10을 저장합니다. i는 정수 변수입니다.
scores[i + 2] = 20 # (i + 2) 번째 요소에 20을 저장합니다. 수식이 인덱스가 됩니다.
리스트 요소에 인덱스 범위를 확인하고 값을 저장하는 코드는 다음과 같습니다.
if i >= 0 and i < len(scores):
scores[i] = number
리스트에 있는 요소들을 순서대로 방문하는 작업은 아주 많이 나타납니다. 기본적으로 2가지의 방법이 있습니다.
첫 번째 방법은 인덱스를 사용하여 방문하는 방법입니다. 예를 들어 크기가 10인 scores 리스트를 가정합시다.
변수를 0에서 시작하여 하나씩 증가시키면서 거기에 해당되는 리스트 요소를 방문하는 방법입니다.
for i in range((len(scores))):
print(i, scores[i])
여기서 len(scores)는 리스트의 크기를 반환하므로 10입니다. 변수 i는 0, 1, 2, 3, ..., 9 와 같이 변경되고 scores[i]는 그 번호에 해당되는 리스트 요소가 됩니다.
만약 리스트 요소를 변경할 필요가 있다면 이것이 유일한 방법입니다.
for i in range((len(scores))):
score[i] = i * 10
하지만 단순히 리스트 요소의 값을 알고 싶은 경우에는 다음과 같은 형식을 사용할 수 있습니다.
# 리스트 안의 요소들이 차례대로 변수에 대입되면서 반복됩니다.
for 변수 in 리스트:
문장1
문장2
예를 들어 scores 리스트의 모든 요소를 출력하려면 다음과 같은 형식을 사용할 수 있습니다.
for element in scores:
print(element)
scores 리스트의 첫 번째 요소부터 변수 element에 할당되고 반복 루프 안의 문장들이 실행됩니다.
한 번의 반복이 끝나면 두 번째 요소가 변수 element에 할당됩니다. 이 경우에는 우리가 리스트의 크기에 대하여 신경 쓰지 않아도 됩니다.
리스트는 list 클래스에 의하여 정의됩니다. list 클래스의 생성자를 이용해서도 생성할 수 있습니다. 다음은 모두 리스트를 생성하는 방법들입니다.
list1 = list() # 공백 리스트 생성
list2 = list("Hello") # 문자 H, e, l, l, o를 요소로 가지는 리스트 생성
list3 = list(range(0, 5)) # 0, 1, 2, 3, 4를 요소로 가지는 리스트 생성
위의 방법들은 초기값을 사용하여 리스트를 생성하는 방법과 동일합니다. 예를 들어 위의 문장들은 아래의 문장들과 동일합니다.
list1 = [] # 공백 리스트 생성
list2 = ["H", "e", "l", "l", "o"] # 문자 H, e, l, l, o를 요소로 가지는 리스트 생성
list3 = [0, 1, 2, 3, 4] # 0, 1, 2, 3, 4를 요소로 가지는 리스트 생성
우리는 동일한 자료형 뿐만 아니라 서로 다른 자료형의 요소를 하나의 리스트 안에 포함할 수 있습니다.
또 리스트 안에 다른 리스트를 포함시키는 것도 가능합니다. 다음 문장들을 참고합시다.
list1 = [12, "dog", 180.14] # 혼합 자료형
list2 = [["Seoul", 10], ["Paris", 12], ["London", 50]] # 내장 리스트
list3 = ["aaa", ["bbb", ["ccc", ["ddd", "eee", 45]]]] # 내장 리스트
1. 훗날 교수님의 노예가 될 봉민이는, 조교로 일할 경우에 대비해 학생들의 성적을 처리하는 프로그램을 만들고자 합니다.
사용자로부터 성적을 입력받아 리스트에 저장한 후 성적의 평균을 구하고 80점 이상 성적을 받은 학생의 숫자를 계산하여 출력합시다.
<실행 결과>
성적을 입력하세요 : 10
성적을 입력하세요 : 20
성적을 입력하세요 : 60
성적을 입력하세요 : 70
성적을 입력하세요 : 80
성적 평균은 48.0 입니다.
80점 이상 성적을 받은 학생은 1 명입니다.
2. 봉민이는 댕댕이를 키우고 싶지만 사료값이 부족하여 댕댕이의 이름부터 먼저 짓기로 하였습니다.
봉민이가 키울 귀여운 댕댕이의 이름을 저장하였다가 출력하는 프로그램을 작성해봅시다.
<실행 결과>
강아지의 이름을 입력하세요 (종료시에는 엔터키) : 아이린
강아지의 이름을 입력하세요 (종료시에는 엔터키) : 슬기
강아지의 이름을 입력하세요 (종료시에는 엔터키) : 웬디
강아지의 이름을 입력하세요 (종료시에는 엔터키) : 조이
강아지의 이름을 입력하세요 (종료시에는 엔터키) : 예리
강아지의 이름을 입력하세요 (종료시에는 엔터키) :
강아지들의 이름 :
아이린, 슬기, 웬디, 조이, 예리,