파이썬 코딩을 더 깔끔하게! #10
Chapter 2. 리스트와 딕셔너리
Better Way 11. 시퀀스를 슬라이싱하는 방법을 익혀라
- 파이썬에는 시퀀스를 여러 조각으로 나누는 슬라이싱 구문이 있다.
- 슬라이싱을 사용하면 시퀀스에 들어있는 아이템의 부분집합에 쉽게 접근할 수 있다.
- __getitem__과 __setitem__ 특별 메서드를 구현하면 클래스에 슬라이싱을 추가할 수 있다.
기본형태 : [시작 : 끝]
시작 인덱스에 있는 원소는 포함, 끝 인덱스에 있는 원소는 포함 X
a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] # (index: 0~7, 총 8개)
print(a[3:5]) # list안에 (index: 3)이상 (index: 5)미만
>> ['d', 'e']
print(a[1:7]) # list안에 (index: 1)이상 (index: 7)미만
>> ['b', 'c', 'd', 'e', 'f', 'g']
리스트의 맨 앞부터 슬라이싱 할 때는 잡음 방지를 위해 0 생략
print(a[:5]) # list안에 처음부터 (index: 5)미만
>> ['a', 'b', 'c', 'd', 'e']
a[0:5] # 권장x
음수 인덱스 사용 : 끝에서부터 슬라이싱
리스트의 끝에서부터 원소를 찾고 싶을 때는 음수 인덱스를 사용
a = ['a', 'b', 'c', 'd'] # (index: 0~3, 총 4개)
print(a[:-1]) # list안에 (index: 0)이상 (index: 뒤에서 첫 번째)미만
>> ['a', 'b', 'c']
print(a[-3:]) # list안에 (index: 뒤에서 세 번째)이상부터 끝까지 == 뒤에서 3개
>> ['b', 'c', 'd']
print(a[2:-1]) # list안에 (index: 2)이상 (index: 뒤에서 첫 번째)미만
슬라이싱 범위 초과 : 자동 무시
슬라이싱 시 리스트의 인덱스 범위가 넘어가는 식의 끝 인덱스는 조용히 무시
단, 인덱스에 직접 접근 시 예외 발생
a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] # (index: 0~7, 총 8개)
print(a[:20])
>> ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] # (index: 8)이상은 무시
print(a[20])
>> IndexError: list index out of range # 인덱스 범위 초과 error 발생
슬라이싱 결과 : 새로운 리스트
슬라이싱 된 리스트는 새로운 리스트이며 원래 리스트에 대한 참조는 그대로 유지된다.
즉, 새로 얻은 리스트를 변경해도 원래 리스트는 바뀌지 않는다.
a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] # (index: 0~7, 총 8개)
b = a[:3]
print(b)
>> ['a', 'b', 'c', 'd'] # 새로 생성된 list b
b[1] = 99
print(b)
>> ['a', 99, 'c', 'd'] # (index: 1)의 요소가 변경된 list b
print(a)
>> ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] # list b의 변화에 영향이 없는 list a
이전 : b = ['a', 'b', 'c', 'd']
이후 : b = ['a', 99, 'c', 'd']
변화x : a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
슬라이스 대입 : 원본 리스트 변경
대입에 스랄이스를 사용하면 원본 리스트에서 지정한 범위 내의 원소를 변경한다.
슬라이스와 대입되는 리스트의 길이가 같을 필요는 없다.
- 슬라이스 길이 a[index1:index2] < 대입되는 배열 길이 [a,b,c] ⇒ 리스트 길이 증가
- 슬라이스 길이 a[index1:index2] > 대입되는 배열 길이 [a,b,c] ⇒ 리스트 길이 감소
a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'] # (index: 0~7, 총 8개)
# 리스트에 지정한 슬라이스 길이(a[2:3]) < 대입되는 배열의 길이([99, 24, 14])
print('이전:', a)
a[2:3] = [99, 24, 14]
print('이후:', a)
>> 이전: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>> 이후: ['a', 'b', 'c', 99, 24, 14, 'd', 'e', 'f', 'g', 'h']
# 리스트에 지정한 슬라이스 길이(a[2:7]) > 대입되는 배열의 길이([99, 24, 14])
print('이전:', a)
a[2:7] = [99, 24, 14]
print('이후:', a)
>> 이전: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
>> 이후: ['a', 'b', 99, 22, 14, 'h']
참고
Author And Source
이 문제에 관하여(파이썬 코딩을 더 깔끔하게! #10), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dongho5041/파이썬-코딩을-더-깔끔하게-10저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)