개발
파이썬 리스트 슬라이싱 [:], [::] 정리 (콜론, 더블콜론)
난 실무에 파이썬을 잘 이용하지는 않지만 정보처리기사를 준비하는도중 파이썬 관련 문법이 몇번 제법 나와서 알게된 사항이다.
개인적으로 공부도하고 정리도 할겸 포스팅을 남겨본다.
파이썬 리스트 슬라이싱
리스트 슬라이싱(List Slicing)이라고 파이썬에서 리스트를 다룰때 사용하는 선택자 기법이 있다.
우리가 흔히 리스트(배열)에서 특정 데이터 구간을 빼온다 싶으면 아래와 같이 작성해서 그 결과를 가져온다.
letters = ['a', 'b', 'c', 'd', 'e']
subset = []
for i in range(1, 4): # 인덱스 1부터 3까지
subset.append(letters[i])
print(subset) # 출력: ['b', 'c', 'd']
Copy
파이썬에선 이런 방식은 직관적이지 않다고 생각했는지 아래와 같은 방식으로 배열 속 데이터를 얻는 방식을 고안해서 사용하고있다.
letters = ['a', 'b', 'c', 'd', 'e']
subset = letters[1:4]
print(subset) # 출력: ['b', 'c', 'd']
Copy
letters[1:4]
의 뜻은 letters
배열 리스트에서 인덱스 1부터 3까지 (끝 4를 제외한)의 데이터를 지칭하는 의미로 range(1, 4)
를 뜻한다.확실히 사용방법만 알면 훨씬 간단하고 직관적인 코드를 제공한다.
여기에 이제 좀 부가적인 처리가 들어가게 되면서 좀 복잡해지기 시작한다.
간격을 줘서 가져오는 방법
단순하게 1, 2, 3 을 가져오는 방식이면 위에처럼
[1:4]
를 지정하면되지만, 1, 3, 5... 처럼 특정 간격으로 띄워져 있는 정보를 가져와야할땐 어떻게 해야할까?대부분 기존 언어는 이럴 경우 if(index % 2) 이런식으로 조건문을 걸어 아래와 같이 처리했다.
a = [0, 1, 2, 3, 4, 5, 6, 7]
selected = []
for i in range(len(a)): # 0부터 끝까지 모든 인덱스 순회
if i % 2 == 0: # 인덱스가 2로 나눠 떨어질 때만
selected.append(a[i])
print(selected) # 출력: [0, 2, 4, 6]
Copy
하지만 파이썬에선 이러는게 줄 수 만 늘리고 언스마트 하다고 생각했는지, 이럴때 step 옵션을 이용하는걸로 이를 해결할 수 있게 했다.
a = [0, 1, 2, 3, 4, 5, 6, 7]
selected = a[0::2]
print(selected) # 출력: [0, 2, 4, 6]
Copy
리스트 슬라이싱은 단계적으로
[시작인덱스:마지막인덱스:스탭]
이런 방식의 입력을 지원받는다.위의 예제같은 경우엔
[0::2]
로 아래와 같이 입력되어 처리되게된다.- 시작인덱스: 0 (처음부터)
- 마지막인덱스: null (끝까지)
- 스탭: 2 (2칸씩 건너뛰며)
0의 경우엔 생략도 가능하니 위의 코드는
selected = a[::2]
이런식으로도 적을 수 있는것이다.이게 다른 언어만 공부했던 입장에선 정말 생소한 방식의 표기(더블콜론이라니...)라 처음보면 적잖게 당황하게된다.
마이너스 인덱스
이건 리스트 슬라이싱을 하다가 더불어 알게된건데, 파이썬은 마이너스 인덱스를 지원한다.
쉽게말해 앞에서부터 0으로 시작한다면, 맨뒤에서부턴 -1부터 시작한다는 논리이다.
a = ['a', 'b', 'c', 'd', 'e']
양수 인덱스: 0 1 2 3 4
요소: 'a' 'b' 'c' 'd' 'e'
음수 인덱스: -5 -4 -3 -2 -1
Copy
그래서 실제로 특정 리스트에서 해당 배열칸을 지칭하는 인덱스는 1개가 아니라 위에처럼 2개가 되어서 실제 인덱스로 값을 접근할때
a[0] == a[-5]
이런 식의 조건문이 참으로 성립 되는것이다.그래서 이런 마이너스 인덱스를 그대로 리스트 슬라이싱에도 이용이 가능하다.
print(a[-3:]) # ['c', 'd', 'e'] (끝에서 세 번째부터 끝까지)
print(a[:-2]) # ['a', 'b', 'c'] (끝에서 두 번째 요소 전까지)
Copy
실제 a 리스트를 위와같이 출력해보면 첫번째 열은 -3(2)에서 -1(4)까지의 인덱스의 결과가 나오게되고, 두번째열은 0에서 -3(2)까지의 인덱스의 결과가 나오게된다.
리스트 슬라이싱 문제
복습겸 아래 문제를 한 번 풀어보자.
다음 파이썬 코드의 실행결과를 고르시오. |
---|
|
① [‘apple’, ‘banana’, ‘cherry’] ② [‘banana’, ‘cherry’, ‘date’] ③ [‘banana’, ‘cherry’] ④ [‘cherry’, ‘date’, ‘elderberry’] |
해설
위 배열의 인덱스는 아래와 같음.
0 | 1 | 2 | 3 | 4 |
'apple' | 'banana' | 'cherry' | 'date' | 'elderberry' |
-5 | -4 | -3 | -2 | -1 |
a[-4:-1] 이므로,
- 시작: -4 ('banana')
- 끝: -1 전까지 ('date'까지)
으로 화면에는 ② [‘banana’, ‘cherry’, ‘date’] 리스트가 출력된다.
#Python
0
개의 댓글
개발 카테고리의 다른 글
04/29
2025 정처기 실기에서 나온 파이썬 리스트 컴프리헨션 (리스트 for문 + if문 축약 생성)
정처기 실기 코딩 문제는 날이가면갈수록 난이도가 우주를 돌파하고있는것 같다.매번 기존 기출문제를 상회하는 방식의 코드를 보여주면서 전공자든 비전공자든 헷갈리게 만드는 요소만 오지게 나오는것같다. 이번에 봣던 시험에서는 특정 리스트의 for문과 if문을 한줄로 축약해 표현하는 파이썬의 리스트 컴프리헨션(List...

04/24
자바스크립트로 만드는 유저 조회수 카운터 기능
내 사이트 조회수는 469인데애드센스 조회수는 117... 뭐냐 이거! 사이트를 운영하는 입장에서 사이트의 활성도를 보는 가장 기본적인 척도는 바로 '조회수'이다.말그대로 조회수는 내 사이트의 특정 페이지의 조회가 얼마나 되었는지 보여주는 정량적 수치로 '방문자수'와 더불어 중요한 지표로 사용된다. 방문자수의 경우...

04/22
nginx 캐싱 설정 (Cache-Control)
앞전의 이야기랑 연계되는 이야기이긴한데,S3서버를 통해서 제공되는 파일은 그쪽에서 캐싱처리를 해도되지만, 웹서버에 올려서 호스팅되는 파일은 웹서버쪽에서 캐싱처리를 해야한다. 더군다나 나는 Docker 환경에 Proxy 방식으로 웹서버를 운용중이라 적용하는데 좀 버거운 과정이 있었다. 쉽게 상황을 풀어보면 도커에서...