Python
스트라이드와 슬라이스를 한 식에 함께 사용하지 말라
두잇 두두
2025. 2. 6. 12:11
728x90
본 블로그 글은 Effective Python의 글을 참조하였습니다.
파이썬은 리스트[시작:끝:증가값] 으로 일정한 간격을 두고 슬라이싱을 할 수 있는 특별한 구문을 제공하는데 이를 stride라고 한다.
문자열을 뒤집는 -1 같은 경우가 유명한데 이미 알고 있으니 -2의 경우도 동작하는 지 확인해본다
x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
x[::2] # ['a', 'c', 'e', 'g']
x[::-2] # ['h', 'f', 'd', 'b']
여기서 -2::-2, -2:2:-2, 2:2:-2에는 어떠한 차이가 있는지 궁금하다
x[2::2] #['c', 'e', 'g']
x[-2::-2] #['g', 'e', 'c', 'a']
x[-2:2:-2] #['g', 'e']
x[2:2:-2] #[]
보기만 해도 머리가 아프다
각 괄호 안에 수가 세 개나 들어가 있으면 코드 밀도가 높아서 읽기 어려우며 증가값에 따라 시작값과 끝값의 역할이 불분명하다. (특히 증가값이 음수인 경우 더 그렇다)
증가값을 사용해야 하는 경우에 양수값으로 만들고 시작과 끝 인덱스를 생략하라.
시작과 끝 인덱스와 함께 증가값을 사용해야 한다면 스트라이딩 한 결과를 변수에 대입한 다음 슬라이싱 하라
y = x[::2] #['a', 'c', 'e', 'g']
z = y[1:-1] #['c', 'e']
스트라이딩한 다음 슬라이싱을 하면 데이터를 shallow copy 하게 된다.
첫 번째 연산은 결과 슬라이스의 크기를 가능한 한 줄일 수 있어야 한다.
시간과 메모리를 감당할 수 없다면 itertools의 islice메서드를 고려하라.