님들 안녕하세요. 14년차 IT 개발자 데니예요. 오늘은 파이썬 리스트(List)에 대한 개념과 사용 방법에 대해서 알아보는 시간을 가져볼게요. 님들께서는 리스트하면 어떤 이미지가 떠오르시나요? 체크 리스트, 환자 리스트, 파일 리스트, 알람 리스트 등등 비슷한 특성을 가진 요소들을 순차적으로 모아 놓은 어떠한 목록 같은 것이 떠오르신다면, 리스트의 개념을 70% 이상 이해하신 거라고 보셔도 무방해요. 방금 떠올린 리스트에 대한 이미지를 계속 머릿속에 떠올리시면서 파이썬 리스트를 학습해 주시면 많은 도움이 될 거예요. 파이썬의 자료형 리스트에 대한 강의 시작해 볼게요.
6. 파이썬 리스트(List) 자료형
▶ 리스트(list)란?
리스트(list)란 하나의 변수에 여러 개의 값을 목록 형태로 관리하는 자료형이에요. 아래 그림을 보시면, 여러 개의 값(1, 2, 3.14, 'Python')을 대괄호 []로 묶은 다음에 변수명 lst1에 대입시켰어요. 두 번째 라인에서 lst1을 입력하고 엔터를 치니, 대괄호에 묶여 있는 여러 개의 값들이 출력되었어요.
이와 같이 여러 개의 값을 대괄호로 묶어 관리하는 자료형을 리스트라고 해요.
리스트의 표현 방법은 요소들을 대괄호 []로 감싸주고, 각 요소는 쉼표 , 로 구분해줘야 해요.
리스트의 특징은 대괄호 내 각 요소마다 순서(sequence)가 존재하기 때문에 인덱싱과 슬라이싱이 가능해요. 리스트 내 가장 좌측에 존재하는 요소의 순번이 0으로 시작하고, 그 다음 요소는 1이 증가되어 순번 1이 돼요. 리스트 내 요소의 총개수가 N개라면 마지막 요소의 순번은 N - 1이 될 거예요. 더 자세한 설명과 이해를 위해서 실습을 진행해 볼게요.
1
2
3
4
5
6
7
8
9
10
|
>>> lst2 = list()
>>> lst2
[]
>>> lst3 = []
>>> lst4 = [0, 1, 2, 3]
>>> lst5 = [1, 2, 3.14]
>>> lst6 = ['Life', 'is', 'too', 'short']
>>> lst7 = [1, 2, 'Life', 'is']
>>> lst8 = [1, 2, ['Life', 'is']]
>>>
|
cs |
라인[1]~[3]은 lst2 변수를 리스트 자료형으로 초기화시켰어요. lst2 변수의 값을 출력시켜 보니, 빈 값 [] 이 출력되었네요.
라인[1]은 라인[4]와 동일한 효과를 가집니다. 라인[4]도 리스트 빈 값으로 변수 lst3를 초기화시켰어요.
라인[5]는 정수 자료형 요소들을 가지고 리스트를 생성했어요.
라인[6]은 정수와 부동 소수점 자료형 요소들을 가지고 리스트를 생성했어요.
라인[7]은 문자열 요소들을 가지고 리스트를 생성했어요.
라인[8]은 정수 자료형 요소와 리스트 요소를 가지고 리스트를 생성했어요. 리스트는 리스트 자체를 요소로 가질 수 있어요. 이러한 리스트를 중첩 리스트라고 해요.
▶ 리스트 인덱싱(indexing)
앞서 언급했듯이 리스트 내 요소는 순번을 가지고 있기 때문에 인덱싱(indexing)이 가능해요. 인덱싱은 문자열 강의에서 이미 학습하신 내용으로 친숙하실 거예요. 사용 방법은 문자열 인덱싱과 동일하니, 문자열 강의를 학습하신 님들은 쉽게 이해하실 거예요.
아래 그림을 보시면 리스트 [1, 2, 3]이 생성되어 변수 lst9에 대입되었어요. 리스트 내 요소 값 1은 순번 0을 가져요. 요소 값 2는 순번 1을 가지고 3은 순번 2를 가집니다. 가장 우측에서부터 순번을 매기면 -1부터 시작해서 가장 좌측 순번은 -3이 돼요. 순번을 통해 리스트 내 요소 값에 접근하는 방법을 리스트 인덱싱이라 하고, 아래 그림에서 라인[4]는 변수명[순번]을 사용해서 리스트 내 요소 값에 접근했어요. 즉, lst9[0]은 리스트 내 요소 중 순번이 0인 요소 값 1에 접근한 것이에요. 라인[5]를 보시면 숫자 1이 출력된 걸 확인하실 수 있어요.
1
2
3
4
5
6
7
|
>>> lst9 = [1, 2, 3]
>>> lst9[0]
1
>>> lst9[0] + lst9[2]
4
>>> lst9[-1]
3
|
cs |
라인[1]은 리스트를 생성해서 변수에 대입했어요.
라인[2]~[3]는 리스트 순번 0인 요소 값에 접근했어요. 그 결과 1이 출력되었어요.
라인[4]~5]는 리스트 순번 0인 요소 값과 순번 2인 요소 값을 더했어요. 1 + 3 = 4 이므로 4가 출력되었어요.
라인[6]~[7]은 리스트 순번을 역순으로 매겨서 순번 -1인 요소 값에 접근했어요. 그 결과 3이 출력되었어요.
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> lst10 = [1, 2, 3, ['a', 'b', 'c']]
>>> lst10[0]
1
>>> lst10[3]
['a', 'b', 'c']
>>> list10[-1]
['a', 'b', 'c']
>>> lst10[3][0]
'a'
>>> lst10[-1][0]
'a'
>>>
|
cs |
라인[1]은 리스트 내 요소로 리스트를 넣어서 리스트를 생성했어요. 즉, 중첩 리스트를 생성했어요.
라인[2]~[3]는 리스트 순번 0번인 요소 값에 접근하여 1이 출력되었어요.
라인[4]~[5]는 리스트 순번 3번인 요소 값에 접근하여 리스트 값 ['a', 'b', 'c']가 출력되었어요.
라인[6]~[7]은 리스트 순번 -1번인 요소 값에 접근하여 리스트 값 ['a', 'b', 'c']가 출력되었어요.
라인[4]와 라인[7]은 동일한 결과를 출력해요.
라인[8]은 지금까지 본 인덱싱 표현 방법은 변수명[순번]이었으나, 변수명[순번][순번]으로 [순번]이 1개 더 추가되었어요. 중첩 리스트에 인덱싱을 사용하기 위해서는 접근하려는 요소 값이 몇 번째 중첩 리스트인지 확인하시고 중첩 횟수에 맞게 [순번]을 추가해서 사용해줘야 해요. 라인[8] 같은 경우에는 중첩 횟수가 2회이므로 변수명[첫번째 리스트 내 요소 순번][두번째 리스트 내 요소 순번]을 사용해서 해당 요소에 접근해줘야 해요. 라인[9]에 결과적으로 'a'가 출력되었어요.
라인[10]은 라인[8]번과 동일한 결과를 출력해요.
1
2
3
4
|
>>> lst11 = [1, 2, 3, ['a', 'b', ['cc', 'dd']]]
>>> lst11[3][2][0]
'cc'
>>>
|
cs |
라인[1]은 중첩 횟수가 3회인 중첩 리스트를 생성해서 변수에 대입했어요.
라인[2]는 변수명[첫 번째 리스트 내 요소 순번][두 번째 리스트 내 요소 순번][세 번째 리스트 내 요소 순번] 표현 방식을 사용하여 최하위 리스트의 요소에 접근하고 있어요.
라인[3] 결과는 'cc'를 출력했어요.
리스트는 중첩하여 생성할 수 있으며, 중첩 리스트도 인덱싱을 통해서 원하는 요소에 접근할 수 있다는 점을 숙지해 주세요.
▶ 리스트 슬라이싱(slicing)
리스트 슬라이싱(slicing)이란 리스트 내 연속되는 여러 개의 요소 값에 접근하는 기능이에요. 슬라이싱(slicing)은 문자열 슬라이싱에서 이미 학습했기 때문에 인덱싱과 마찬가지로 익숙한 기능일 거예요. 리스트 인덱싱(indexing)은 리스트 내 요소 값 1개에만 접근 가능했다면, 리스트 슬라이싱(slicing)은 리스트 내 연속되는 여러 개의 요소 값에 접근할 수 있어요. 실습을 통해서 사용법을 더 자세히 잘 펴볼게요.
1
2
3
4
|
>>> lst12 = [1, 2, 3, 4, 5, 6]
>>> lst12[0:3]
[1, 2, 3]
>>>
|
cs |
라인[1]은 리스트 [1, 2, 3, 4, 5, 6]을 생성해서 변수 lst12에 대입했어요.
라인[2]은 리스트 슬라이싱 표현 방법인 리스트변수명[시작순번:종료순번]을 사용해서 lst12 리스트 내 요소 중 순번 0부터 순번 2까지 연속되는 요소 값에 접근하고 있어요. 근데 좀 이상하죠? list12[0:3]이면 순번 0부터 3까지 연속되는 요소 값에 접근해야 하는 게 아닌가요?라는 질문을 하실 수었어요. 제 대답은 아니라고 말씀드리고 싶어요. 시작 순번은 0을 포함하지만, 종료 순번은 3을 포함하지 않아요. 그래서 종료 순번 - 1를 해줘야 해요. 이건 파이썬 문법이니 어쩔 수 없이 우리는 기억을 하고 따라야 해요.
라인[3]은 순번 0부터 2까지 해당하는 요소 값은 [1, 2, 3]을 출력했어요.
1
2
3
4
5
6
7
8 |
>>> lst12 = [1, 2, 3, 4, 5, 6]
>>> lst12[:3] [1, 2, 3]
>>> lst12[3:]
[4, 5, 6]
>>> lst12[:]
[1, 2, 3, 4, 5, 6]
>>>
|
cs |
라인[2]은 lst12[:3]이라고 리스트 슬라이싱 표현 방법을 사용했어요. 시작 순번은 없고, 종료 순번만 3만 있어요. 시작 순번이 없으면 리스트 내 요소 제일 처음부터 접근한다라고 생각해 주세요. 종료 순번이 없으면 리스트 내 요소 제일 마지막까지 접근한다라고 생각해주세요. 라인[2]을 다시 보시면 시작 순번이 없으므로 리스트 내 요소 제일 처음부터 접근해야 한다고 생각하셔야 해요. 라인[3] 출력결과를 살펴볼게요.
라인[3]는 리스트 내 순번 0부터 2까지 연속되는 요소 값인 [1, 2, 3]이 출력되었어요. 라인[2]은 lst12[0:3]과 동일한 표현 방법이라고 생각해 주시면 돼요.
라인[4]은 종료 순번이 없네요. 종료 순번이 없으면 리스트 내 요소 제일 마지막까지 접근한다고 생각해 주시면 돼요. 즉, lst12[3:6]으로 바꿔 표현할 수 있어요.
라인[5]는 리스트 내 순번 3부터 5까지 연속되는 요소 값인 [4, 5, 6]이 출력되었어요.
라인[6]는 시작 순번과 종료 순번 모두 없어요. 둘 다 없으니, 리스트 내 요소 제일 처음부터 마지막까지 접근한다고 보시면 돼요. 즉, lst12[0:6]으로 바꿔 표현할 수 있어요.
라인[7]은 리스트 내 순번 0부터 5까지 연속되는 요소 값인 [1, 2, 3, 4, 5, 6]이 출력되었어요.
1
2
3
4
5
6
7
8 |
>>> lst12 = [1, 2, 3, 4, 5, 6]
>>> lst12[-6:] [1, 2, 3, 4, 5, 6]
>>> lst12[:-1]
[1, 2, 3, 4, 5]
>>> lst12[-3:-1]
[4, 5]
>>>
|
cs |
라인[2]는 시작 순번에 마이너스 부호를 표시해서 요소 값에 접근하고 있어요. 마이너스 부호를 사용한다는 건 리스트 순번을 역순으로 사용한다는 의미예요. 즉, -1이면 라인[1]에서 생성된 리스트 내 요소 값 중 제일 마지막 값인 6의 순번이예요. 순번이 -2이면 리스트 내 요소 값 5의 순번인거예요. 순번을 역순으로 사용하면 제일 마지막 값부터 -1로 시작에서 좌측으로 -2, -3, -4....로 리스트 내 요소 첫 번째 값까지 순번이 매겨져요. 라인[2]는 lst12[0:6] 또는 lst12[0:]으로 바꿔서 사용해도 동일한 결과를 출력해 줘요.
라인[3]은 리스트 내 순번 -6부터 -1까지 연속되는 요소인 [1, 2, 3, 4, 5, 6]이 출력되었어요.
라인[4]는 시작 순번은 없고, 종료 순번이 -1로 되어 있어요. 시작 순번은 미포함이므로 리스트 내 순번 -6부터 -2까지 연속되는 요소 값에 접근할 거예요.
라인[5]은 리스트 내 순번 -6부터 -2까지 연속되는 요소인 [1, 2, 3, 4, 5]가 출력되었어요.
라인[6]는 리스트 내 요소 -3부터 -2까지 연속되는 요소를 출력시키는 표현 방식이에요.
라인[7]은 리스트 순번 -3부터 2까지 연속되는 요소인 [4, 5]가 출력되었어요.
1
2
3
4
5
6
|
>>> lst13 = [1, 2, ['a', 'b', 'c'], 3, 4, 5]
>>> lst13[1:5]
[2, ['a', 'b', 'c'], 3, 4]
>>> lst13[2][:2]
['a', 'b']
>>>
|
cs |
라인[1]은 리스트 내 요소로 리스트를 가지는 중첩 리스트를 생성해서 변수 lst13에 대입했어요.
라인[2]는 리스트 순번 1번부터 5번까지 연속되는 요소 값에 접근하고 있어요. 중첩 리스트는 리스트 내 리스트를 요소 값으로 가지므로 리스트 내 요소인 ['a', 'b', 'c'] 리스트도 순번을 가져요. ['a', 'b', 'c'] 리스트 순번은 3번이예요. 역순 순번은 -4예요.
라인[3]은 순번 1부터 5까지 연속되는 요소인 [2, ['a', 'b', 'c'], 3, 4]가 출력되었어요.
라인[4]는 리스트 인덱싱과 리스트 슬라이싱이 동시에 사용된 표현 방법이에요. 처음 lst13[2]는 리스트 내 순번 2인 요소 값에 접근하는 인덱싱 방법이에요. 순번 2인 리스트 ['a', 'b', 'c']에 접근하고 있어요. 그렇다면 lst13[2][:2]는 리스트 ['a', 'b', 'c'] 내에서 리스트 슬라이싱을 하겠다는 의미예요. 시작 순번은 없고, 종료 순번은 2이에요. 그러므로 ['a', 'b', 'c'] 리스트 제일 처음 값인 'a'부터 시작해서 'b'까지 접근할 거예요.
라인[5]는 lst13 리스트 내에 순번 2인 리스트 ['a', 'b', 'c']를 가지고 리스트 슬라이싱을 해서 ['a', 'b']가 출력되었어요.
▶ 리스트 연산(+, *)
리스트에도 파이썬 문자열처럼 연산 기능이 포함되어 있어요. 연산자 +, *를 사용하여 리스트 연산이 가능해요. + 연산은 각 리스트의 요소를 합치는 연산이에요. *연산은 리스트 요소를 반복시켜주는 연산이예요. 산술 연산에서 +는 각 요소를 더하고, *는 각 요소를 곱하는 연산이지만, 파이썬 리스트에서는 +는 합치는 의미이고, *는 반복하는 의미로 사용한다는 것을 꼭 기억해 주세요. 확실하게 이해가 가지 않으셨을 테니 실습을 통해서 자세히 알아볼게요.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
>>> lst14 = [1, 2, 3]
>>> lst15 = [4, 5, 6]
>>> lst14 + lst15
[1, 2, 3, 4, 5, 6]
>>> lst15 + lst14
[4, 5, 6, 1, 2, 3]
>>> lst14 * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]
>>> lst15 * 2
[4, 5, 6, 4, 5, 6]
>>> (lst14 + lst15) * 2
[1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
>>>
|
cs |
라인[3]은 리스트 변수 lst14와 lst15를 +를 사용하여 연산하였어요. 앞서 말씀드렸듯이 +연산자는 각 리스트 요소를 합친다는 의미예요.
라인[4]는 리스트 변수 lst14의 요소와 lst15의 요소를 순서대로 모두 합쳐 [1, 2, 3, 4, 5, 6]이 출력되었어요.
라인[5]는 리스트 변수 순서를 바꿔 lst15와 lst14를 +를 사용하여 연산하였어요.
라인[6]은 lst15 리스트 요소와 lst14 리스트 요소를 모두 합쳐 [4, 5, 6, 1, 2, 3]이 출력되었어요. 연산 순서대로 합쳐져 출력돼요.
라인[7]은 lst14 리스트에 * 연산자를 사용하여 3를 곱했어요. *연산자는 리스트에서 반복의 의미를 가진다고 말씀드렸어요.
라인[8]은 lst14에 포함 요소들이 3번 반복되어 [1, 2, 3, 1, 2, 3, 1, 2, 3]으로 출력되었어요.
라인[9]는 lst15 리스트에 *연산자를 사용하여 2를 곱했어요. 라인[10]은 리스트 lst15 요소들이 2번 반복되어 [4, 5, 6, 4, 5, 6]으로 출력되었어요.
라인[11]은 각 리스트에 +연산을 수행한 후, * 연산을 수행했어요.
라인[12]는 +연산을 한 결과 값인 [1, 2, 3, 4, 5, 6]리스트에 *연산을 수행해서 결과적으로 [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]이 출력되었어요.
▶ 리스트 수정
리스트를 조작하다 보면 리스트 내 요소 값을 수정해야 하는 일이 발생하기도 해요. 그럴 때 우리는 리스트 내 요소의 순번(인덱스)을 사용해서 해당 요소 값을 수정할 수 있어요. 실습을 통해서 자세히 알아볼게요.
1
2
3
4
5
6
7
8
|
>>> lst16 = [1, 2, 3, ['Math', 'Science']]
>>> lst16[0] = 10
>>> lst16
[10, 2, 3, ['Math', 'Science']]
>>> lst16[3] = 'Subject'
>>> lst16
[10, 2, 3, 'Subject']
>>>
|
cs |
라인[1]은 lst16 변수에 중첩 리스트를 생성하여 대입했어요.
라인[2]은 리스트 인덱싱을 사용해서 lst16 리스트 순번(인덱스) 0에 값 10을 대입했어요. 원래 lst16 리스트 내 순번 0을 가지는 요소 값은 1이었어요. 라인[2]가 수행되면 리스트 순번 0의 값 1이 10으로 수정될 거예요.
라인[3]~[4]은 리스트 lst16를 출력해 봤어요. 1에서 10으로 수정된 리스트 [10, 2, 3, ['Math', 'Science']]가 출력되었어요.
라인[5]는 lst16 리스트의 순번(인덱스) 3을 가지는 요소 ['Math', 'Science']를 'Subject'로 수정했어요. 즉, 리스트 값을 문자열로 수정했어요.
라인[6]~[7]은 lst16을 출력했어요. 수정된 리스트 [10, 2, 3, 'Subject']가 출력되었어요.
▶ 리스트 삭제
리스트 내 요소를 삭제하고 싶은 경우에 리스트 인덱싱을 통해서 삭제할 수 있어요. 또한, 리스트 슬라이싱을 사용해서 연속되는 리스트 요소 값들을 삭제할 수도 있어요. 실습을 통해서 자세히 살펴볼게요.
1
2
3
4
5
6
7
8
9
|
>>> lst17 = [1, 2, 3, ['Math', 'Science']]
>>> del lst17[3]
>>> lst17
[1, 2, 3]
>>> lst18 = [1, 2, 3, 4, 5, 6]
>>> del lst18[0:3]
>>> lst18
[4, 5, 6]
>>>
|
cs |
라인[1]은 중첩 리스트를 생성해서 lst17 변수에 대입했어요.
라인[2]는 del 명령어를 사용해서 lst17 리스트 순번(인덱스) 3을 가지는 요소 ['Math', 'Science']를 삭제했어요. 리스트 내 요소를 삭제하기 위해서는 del 명령어를 사용해야 해요. 추가로 remove() 함수를 사용해서도 리스트 내 요소를 삭제할 수 있어요. 해당 함수는 다음 시간에 설명해 드릴게요. del 명령어 사용할 때 주의 사항이 있어요. del lst17을 하게 되면 lst17 리스트가 모두 삭제되므로 리스트 내 요소를 삭제하고자 하시면 반드시 del lst17[3]처럼 리스트 인덱싱 방식으로 요소에 접근하셔서 해당 요소만 삭제하셔야 해요.
라인[3]~[4]는 lst17 리스트를 출력했어요. 순번 3인 요소 값이 삭제되고 [1, 2, 3]이 출력되었어요.
라인[5]는 리스트를 생성해서 lst18 변수에 대입했어요.
라인[6]은 리스트 슬라이싱 방식을 사용해서 리스트 순번 0부터 2까지 연속되는 요소 값들을 삭제했어요.
라인[7]~[8]은 리스트 순번 0부터 2까지 연속되는 값인 [1, 2, 3]이 삭제되어 리스트 [4, 5, 6]만 출력되었어요.
님들 오늘은 파이썬 리스트에 대해서 살펴보았어요. 양방향 강의가 아니다 보니 님들과 함께 소통할 수 없다는 점이 조금 아쉽지만 님들께서 잘 따라와 주신다고 믿고 열심히 강의 포스팅하고 있어요. 만약 제게 피드백을 주신다거나 파이썬 학습하시다가 궁금하신 점이 있으시면 언제든지 제 이메일로 연락 주시면 성실하게 답변드릴게요. 제 이메일은 dannyeducation1@gmail.com 이예요. 그럼 오늘은 여기까지 할게요. 감사해요. 다음 시간에 봬요.
'파이썬 독학 > 입문 강의' 카테고리의 다른 글
[파이썬독학강의] 7. 파이썬 튜플(Tuple) 자료형 (0) | 2023.02.20 |
---|---|
[파이썬독학강의] 6.2 파이썬 리스트 함수 (0) | 2023.02.13 |
[파이썬독학강의] 5.6 파이썬 문자열 함수(function)_문자열 관련 함수 (0) | 2023.02.05 |
[파이썬독학강의] 5.5 파이썬 문자열 f-string 사용법 (0) | 2023.02.02 |
[파이썬독학강의] 5.4 파이썬 문자열 포매팅(Formatting)_문자열 포맷 (0) | 2023.01.30 |