문자열과 마찬가지로 리스트에서도 인덱싱과 슬라이싱을 할 수 있다.
예문을 통해서 확인해보자.
리스트의 인덱싱(Indexing)
리스트 인덱싱 방법
>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a[0] # 0번 위치의 요소값 반환
1
>>> a[2] # 2번 위치의 요소값 반환
3
리스트의 인덱싱은 문자열의 인덱싱과 매우 비슷하다. 리스트 역시 순서를 1이 아닌 0부터 세기 때문에 첫 번째 요소 값을 출력하기 위해서는 인덱싱 숫자를 0으로 해야 한다.
요소 값 수정 및 삭제
>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a[0] = 4 # 0번에 위치한 요소값 변경
>>> a
[4, 2, 3]
>>> del a[1] # a[1] 요소 리스트에서 삭제
>>> a
[4, 3]
>>> del a # 리스트 a 삭제
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
리스트를 인덱싱 하여 리스트의 요소 값을 수정하는 것도 가능하다. 위 예문의 두 번째 코드를 보면 리스트 a의 첫 번째 요소값을 4로 변경하여 리스트 a가 [1, 2, 3]에서 [4, 2, 3]이 되었다.
또한 del 함수를 이용하여 리스트의 요소 값을 삭제하는 것도 가능하다 . 세 번째 코드를 보자. 리스트 a의 1번에 위치한 a[1]을 삭제하여 리스트 a는 [4, 2, 3]에서 [4, 3]이 되었다.
마지막 코드처럼 del 함수를 이용하여 리스트 전체를 삭제하는 것도 가능하다.
요소값 연산하기
>>> a = [1, 2, 3, 'a', 'b', 'c']
>>> a[0] + a[2] # 숫자형의 연산 1 + 3 = 4
4
>>> a[1] * a[3] # 숫자와 문자열의 연산 2 * 'a' = 'aa'
'aa'
>>> a[3] * a[4] # 문자열 * 문자열 → 에러 발생
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: cant multiply sequence by non-int of type 'str'
>>> a[0] + a[5] # 숫자 + 문자열 → 에러 발생
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
파이썬의 요소 값으로 계산하는 것도 가능하다. 위 코드를 보면 각 연산자에 따라 결과가 출력된다.
하지만 리스트에서는 다양한 자료형이 있는 만큼 각 요소 값에 적용이 안 되는 계산식에는 에러가 출력된다.
위에서 마지막 코드를 보면 a[0]은 숫자인 반면 a[5]는 문자열이기 때문에 '+' 연산이 안 되고 에러가 발생했다.
뒤에서부터 숫자 세기
>>> a = [1, 2, 3, 'a', 'b', 'c']
>>> a[-1] # 뒤에서 첫 번째
'c'
>>> a[-4] # 뒤에서 네 번째
3
문자열과 마찬가지로 리스트도 뒤에서부터 인덱싱이 가능하다. 뒤에서부터 숫자를 셀 때는 0부터 시작하지 않고 -1부터 시작한다. 따라서 뒤에서 첫 번째 위치의 인덱싱 번호는 -0이 아닌 -1이다.
리스트의 슬라이싱(Slicing)
리스트 슬라이싱 방법
>>> a = [1, 2, 3, 'a', 'b', 'c']
>>> a
[1, 2, 3, 'a', 'b', 'c']
>>> a[:] # 처음부터 끝까지의 요소값, 결국 a = a[:]
[1, 2, 3, 'a', 'b', 'c']
>>> a[2:] # a[2]부터 리스트의 마지막 요소까지 슬라이싱
[3, 'a', 'b', 'c']
>>> a[1:4] # a[1]부터 a[3]까지 슬라이싱
[2, 3, 'a']
인덱싱의 슬라이싱 역시 문자열과 크게 다르지 않다. 다양한 예시를 통해 리스트의 슬라이싱을 익혀보자.
대괄호([ ])와 콜론(:)으로 리스트의 슬라이싱을 할 수 있는데, 변수명[시작번호:끝번호] 이런 식이다. 그리고 슬라이싱의 범위는 시작번호 ≤ 요소 값 < 끝번호-1 이다. 예를 들면 a[1:4]는 a[1], a[2], a[3]이 슬라이싱 된다.
위의 두 번째 코드를 보자. a[:]는 콜론의 앞 뒤가 모두 공백으로 되어있다. 콜론 앞에 공백이 있으면 처음부터, 뒤에 있으면 끝까지 슬라이싱 하라는 의미이다. a[:]는 앞 뒤가 모두 없으니 처음부터 끝까지 슬라이싱을 해서 원본 a와 같은 리스트가 된다. 세 번째 코드 a[2:]는 a[2]부터 끝까지 슬라이싱 하며 네 번째 코드 a[1:4]는 a[1]부터 a[3]까지 슬라이싱 한다.
인덱싱과 슬라이싱 후 자료형 차이
>>> a = [1, 2, 3, 'a', 'b', 'c']
>>> a[0] # 리스트 a의 첫 번째 요소값 인덱싱
1
>>> type(a[0]) # 정수형 반환
<class 'int'>
>>> a[4], type(a[4]) # a[4] 문자열 반환
('b', <class 'str'>)
>>> a[0:1] # 리스트 a의 첫 번째 요소값 슬라이싱
[1]
>>> type(a[0:1]) # 리스트 반환
<class 'list'>
리스트를 인덱싱 하면 해당 요소 값의 자료형 형태로 데이터가 출력된다. 정수형은 int, 문자열은 str 형태로 요소 값을 반환하게 된다.
반면 리스트를 슬라이싱 하게 되면, 리스트 자료형이 반환된다. 마지막 코드를 보면 a[0:1]은 첫 번째 요소값만 포함하지만, a[0]과 달리 a[0:1]은 리스트 자료형으로 반환되는 것을 볼 수 있다.
뒤에서부터 숫자 세기
>>> a[:-2] # 리스트의 처음부터 a[-3]까지 슬라이싱
[1, 2, 3, 'a']
>>> a[-2:] # a[-2]부터 리스트의 마지막까지 슬라이싱
['b', 'c']
>>> a[-5:-2] # a[-5]부터 a[-3]까지 슬라이싱
[2, 3, 'a']
>>> a[2:-1] # a[2]부터 a[-2]까지 슬라이싱
[3, 'a', 'b']
슬라이싱 역시 뒤에서부터 숫자를 세는 것이 가능하다. 마지막 코드처럼 정방향과 역방향의 인덱싱 넘버를 혼합하여 슬라이싱 하는 것도 된다.
인덱싱 & 슬라이싱 심화 - 다중 리스트 다루기
삼중 리스트에서 인덱싱 하기
>>> a = [1, 2, ['three', 'four', ['다섯', '여섯']]]
>>> a
[1, 2, ['three', 'four', ['다섯', '여섯']]]
위 리스트를 보자. 리스트 안에 또 다른 리스트가 있으며 또다른 리스트 안에 하나의 리스트가 더 있는 구조이다.
이 리스트를 천천히 해부해보자.
리스트 a의 구조를 보자. a[0], a[1]에는 정수형이 들어 있고, a[2]는 리스트가 들어있다. 이를 파이썬으로 출력해보자.
>>> a[0]
1
>>> a[1]
2
>>> a[2] # 리스트 a 안의 리스트 인덱싱
['three', 'four', ['다섯', '여섯']]
>>> type(a[2]) # a[2]의 자료형 출력
<class 'list'>
a[0], a[1]은 정수형(int)을 반환하고 a[2]는 리스트 ['three', 'four', ['다섯', '여섯']]를 반환했다.
a[2]라는 리스트가 생긴 격이다. 이번에는 a[2]를 더 쪼개 보자.
리스트 a[2]의 요소값을 보자. a[2]는 리스트이기 때문에 리스트 a와 똑같이 인덱싱 해보자.
그럼 a[2]의 요소 값들은 a[2][0], a[2][1], a[2][2] 이렇게 세 개가 나온다.
코드로 확인해보자.
>>> a[2][0] # 문자열 출력
'three'
>>> a[2][1] # 문자열 출력
'four'
>>> a[2][2] # 리스트 출력
['다섯', '여섯']
>>> type(a[2][2]) # 리스트 자료형
<class 'list'>
이번에도 마찬가지로 a[2][2]라는 리스트가 새로 생겼으며, ['다섯', '여섯']의 값을 가진다. 한번 더 이 리스트를 쪼개 보자.
더 이상 쪼갤 것이 없는 리스트 a[2][2]의 구조이다. 각 요소값을 화면에 출력해보자.
>>> a[2][2][0]
'다섯'
>>> a[2][2][1]
'여섯'
>>> a[2][2][:] # 리스트 a[2][2]의 전 요소 반환
['다섯', '여섯']
>>> a[2][2][0:1]
['다섯']
리스트 a[2][2]의 요소 값에 접근하고 슬라이싱도 적용해보았다. 처음에 복잡해 보이던 삼중 리스트도 천천히 쪼개면서 접근하면 생각보다 간단하다는 걸 알 수 있다.
2022.09.28 - [파이썬/기초 문법] - [Python]리스트(list) 자료형 만들기 & 리스트의 연산
2022.09.30 - [파이썬/기초 문법] - [Python]리스트 함수[1/2]: 요소값 추가와 삭제 -append, insert, extend, remove, pop
2022.10.01 - [파이썬/기초 문법] - [Python]리스트 함수[2/2]: 정렬, 카운트, 위치 - sort, reverse, count, index
'파이썬 > 기초 문법' 카테고리의 다른 글
[파이썬]리스트의 정렬, 카운트, 위치찾기 (1) | 2022.10.01 |
---|---|
[파이썬]리스트 요소값 추가와 삭제하기 (1) | 2022.09.30 |
[파이썬] 리스트 자료형의 생성과 연산 (0) | 2022.09.28 |
[파이썬]문자열 함수들 - 대문자, 소문자, 알파벳, 숫자 (0) | 2022.09.27 |
[파이썬]문자열 함수들 - 대문자, 소문자, 공백제거, 바꾸기 (0) | 2022.09.26 |
댓글