파이썬 강좌 – 슬라이싱 – 리스트 간편하게 접근하기

  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 – 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 – 왜 파이썬인가?
    4. 파이썬 설치 – Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 – 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 – 소통하기
    2. 변수와 대입 – 기억하기
    3. 연산자 – 계산하기
    4. 조건문 – 분기를 만들기
    5. 반복문 – 비슷한 작업을 반복하기
    6. 반복문 코딩하기
    7. 변수와 리스트 – 비슷한 변수들을 묶기
    8. for, range – 리스트의 항목을 다루기
    9. 함수와 메소드의 호출 – 편리한 기능 이용하기
    10. 모듈 설치와 사용 – 유용한 기능 끌어다 쓰기
    11. 문자열 – 텍스트 다루기
  4. 파이썬 중급
    1. 함수를 직접 만들기 – 자주 쓰는 기능을 묶기
    2. 딕셔너리, 튜플, 세트 – 변수를 다양한 방법으로 묶기
    3. 클래스와 객체 – 변수를 사람으로 진화시키기
    1. 상속 – 클래스를 확장하기
    2. 정체성과 동질성 – 객체의 성질
    3. 특별 메소드와 연산자 – 파이썬의 내부 작동방식 이해하기
    4. 다양한 함수 인수 – 유연한 함수 만들기
    5. 슬라이싱 – 리스트 간편하게 접근하기
    6. 지능형 리스트(List Comprehension) – 리스트 갖고 놀기
    7. namedtuple - 데이터 묶음 손쉽게 만들기
    8. 조건 표현식 (Conditional Expression) - 간단한 분기 나타내기
    9. 코드 스타일 - 코드의 일관성 유지하기
    10. 명령문, 표현식 – 문법을 이루는 것들
    11. 본격적인 검색 해보기
  5. 파이썬 고급
    1. 일급 함수 다루기
    2. NotImplementedError와 NotImplemented
    3. 어노테이션 – 수월하게 프로그래밍하기
    1. 내장 함수 톺아보기
    2. 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
    3. 변수의 범위 – 이름 검색의 범위
  6. 파이썬 심화
    1. 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
    2. 데코레이터 – 함수의 기능을 강화하기
    3. 프로퍼티
    4. 제너레이터
    5. async와 await
    6. 객체로서의 클래스 – 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
    3. 원카드 게임 만들기 (3) (작성중)
    4. 턴제 자동 전투 게임 만들기 (작성중)
  8. 실전 (파이썬 외적인 것들)
    1. 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
    2. 유니코드 – 컴퓨터에서 문자를 표기하는 방법
    3. html, css, 인터넷 – 자동화 첫 걸음 내딛기
    4. 네트워크 – 인터넷으로 통신하는 방법
    5. 문서 – 문맥을 읽어보기

슬라이스를 사용하는 예제

일단 리스트 하나를 만들어봅시다. 아래 리스트는 항목이 총 18개입니다. 인덱스는 0에서 17이겠지요.

ls = [1, 2, 23, 48, 5, 66, 7, 8, 9, 10, 14, 12, 18, 45, 19, 1, 5, 3]

좋습니다, 이제 이 리스트에서 인덱스 2부터 17까지의 요소를, 3칸 간격으로 뽑아내고 싶습니다. 고전적인 while과 변수 하나를 이용해서 구현을 해봅시다.

ls = [1, 2, 23, 48, 5, 66, 7, 8, 9, 10, 14, 12, 18, 45, 19, 1, 5, 3]
another_ls = []
i = 2
while i < 18:
    another_ls.append(ls[i])
    i += 3
print(another_ls)
[23, 66, 9, 12, 19, 3]

좋습니다. 우리의 의도대로 아주 잘 동작합니다.


그런데 뭔가 스멀스멀 떠오르지 않나요? 저런 상황은 우리가 이전에 한 번 접했습니다. 곧바로 range가 떠오릅니다. 우리가 range를 만들 때 범위를 어떻게 지정했는지 기억하시나요?

ls = [1, 2, 23, 48, 5, 66, 7, 8, 9, 10, 14, 12, 18, 45, 19, 1, 5, 3]
another_ls = []
for i in range(2, 18, 3):
    another_ls.append(ls[i])
print(another_ls)
[23, 66, 9, 12, 19, 3]

range(2, 18, 3)은 2 이상 18 미만까지 간격을 3칸으로 하여 숫자를 뽑아내겠다는 뜻입니다. 이를 이용하여 i라는 변수를 일일히 다루지 않고 간편하게 for에 포함시켰습니다!


하지만, 슬라이싱이라는 문법을 이용하면 이조차 더 간단하게 하여, 아주 손쉽게 해당 리스트의 일부를 얻어올 수 있습니다.

ls = [1, 2, 23, 48, 5, 66, 7, 8, 9, 10, 14, 12, 18, 45, 19, 1, 5, 3]
another_ls = ls[2:18:3]
print(another_ls)
[23, 66, 9, 12, 19, 3]

용법

문법은 sequence[start:end:step] 입니다.start부터 시작하여, end 미만일 때까지 (절대 end를 포함하지 않아요!) step의 간격만큼 반복한다는 뜻입니다! range와는 조금 비슷하지만 다르게, 각 항목을 생략할 수도 있는데요, start를 생략하게 되면 0으로, end를 생략하게 되면 완전 끝까지, step을 생략하면 1이 됩니다. 아래는 예시입니다. 참 쉽죠? ls는 처음에 0부터 15까지의 숫자를 차례대로 지니고 있습니다. 그래서 슬라이스 결과가 어떤 인덱스를 가리키는지 직관적으로 알 수 있습니다.

ls = list(range(16))
print(ls)
print(f'{ls[4:11:2] = }')
print(f'{ls[:11:2] = }')
print(f'{ls[4::2] = }')
print(f'{ls[4:11:] = }')
print(f'{ls[4::] = }')
print(f'{ls[:11:] = }')
print(f'{ls[::2] = }')
print(f'{ls[::] = }')
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
ls[4:11:2] = [4, 6, 8, 10]
ls[:11:2] = [0, 2, 4, 6, 8, 10]
ls[4::2] = [4, 6, 8, 10, 12, 14]
ls[4:11:] = [4, 5, 6, 7, 8, 9, 10]
ls[4::] = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
ls[:11:] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ls[::2] = [0, 2, 4, 6, 8, 10, 12, 14]
ls[::] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]

슬라이스에는 음수도 사용할 수 있습니다. startend에 음수가 있을 때에는 마지막으로부터 얼마나 떨어져있는지를 나타냅니다. 예를 들어 -1이라면 가장 마지막에 있는 항목이고 -4라면 마지막에서 네 번째에 있는 항목을 나타냅니다. step이 음수라면 인덱스가 점차적으로 작아집니다. 어느 하나가 음수이든지 상관없이 생략도 할 수 있습니다. 이를 이용해 온갖 기상천외한 조합을 만들 수 있습니다.

ls = list(range(16))
print(ls)
print(ls[-10:-3:]) # 마지막 10번째 이상, 마지막 3번째 미만, 1칸 씩 커짐.
print(ls[12:5:-1]) # 12이하 5초과, 1칸 씩 작아짐.
print(ls[12::-1]) # 12이하 처음까지, 1칸 씩 작아짐.
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
[6, 7, 8, 9, 10, 11, 12]
[12, 11, 10, 9, 8, 7, 6]
[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

연습 문제

  1. 슬라이스는 무엇인가?

프로그래밍 문제

ls = list(range(16)) 로부터 시작하도록 합니다. 아래 문제는 모두 슬라이스를 이용하도록 합니다.

  1. 이 리스트를 왼쪽 두 개, 오른쪽 두 개를 모두 제외하여 출력하세요.
  2. 이 리스트를 왼쪽 두 개, 오른쪽 두 개를 모두 제외하여, 큰 수부터 작은 수까지 3칸 간격으로 출력하세요.

  1. 리스트의 범위를 넘어가는 수를 넣었을 때 어떻게 되는지 실험해보세요.

프로그래밍 문제 정답

  1. print(ls[2:-2:]) (결과: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] )
  2. print(ls[-3:1:-2]) (결과: [13, 10, 7, 4] )
  3. 범위를 벗어난 항목에 대해서는 단순히 계산하지 않을 뿐이다. 에러는 발생하지 않는다. start-100과 같이 아주 큰 수를 둔다 해도 0부터 잘 시작한다.
  1. 프롤로그
  2. 개발 첫걸음
    1. 컴퓨터 구성요소 – 컴퓨터는 어떤 걸 할 수 있나?
    2. 개발과 관련된 용어
    3. 파이썬의 선택 – 왜 파이썬인가?
    4. 파이썬 설치 – Hello World 출력하기
    5. Visual Studio Code 의 편리한 기능
    6. REPL과 콘솔 창 – 파이썬 동작시키기
  3. 파이썬 기초
    1. 기초 입출력 – 소통하기
    2. 변수와 대입 – 기억하기
    3. 연산자 – 계산하기
    4. 조건문 – 분기를 만들기
    5. 반복문 – 비슷한 작업을 반복하기
    6. 반복문 코딩하기
    7. 변수와 리스트 – 비슷한 변수들을 묶기
    8. for, range – 리스트의 항목을 다루기
    9. 함수와 메소드의 호출 – 편리한 기능 이용하기
    10. 모듈 설치와 사용 – 유용한 기능 끌어다 쓰기
    11. 문자열 – 텍스트 다루기
  4. 파이썬 중급
    1. 함수를 직접 만들기 – 자주 쓰는 기능을 묶기
    2. 딕셔너리, 튜플, 세트 – 변수를 다양한 방법으로 묶기
    3. 클래스와 객체 – 변수를 사람으로 진화시키기
    1. 상속 – 클래스를 확장하기
    2. 정체성과 동질성 – 객체의 성질
    3. 특별 메소드와 연산자 – 파이썬의 내부 작동방식 이해하기
    4. 다양한 함수 인수 – 유연한 함수 만들기
    5. 슬라이싱 – 리스트 간편하게 접근하기
    6. 지능형 리스트(List Comprehension) – 리스트 갖고 놀기
    7. namedtuple - 데이터 묶음 손쉽게 만들기
    8. 조건 표현식 (Conditional Expression) - 간단한 분기 나타내기
    9. 코드 스타일 - 코드의 일관성 유지하기
    10. 명령문, 표현식 – 문법을 이루는 것들
    11. 본격적인 검색 해보기
  5. 파이썬 고급
    1. 일급 함수 다루기
    2. NotImplementedError와 NotImplemented
    3. 어노테이션 – 수월하게 프로그래밍하기
    1. 내장 함수 톺아보기
    2. 예외와 에러 – 예상치 못한 상황에 대응하기 (v0.1)
    3. 변수의 범위 – 이름 검색의 범위
  6. 파이썬 심화
    1. 시퀀스와 반복자 – 반복과 순회를 자유자재로 다루기
    2. 데코레이터 – 함수의 기능을 강화하기
    3. 프로퍼티
    4. 제너레이터
    5. async와 await
    6. 객체로서의 클래스 – 클래스를 동적으로 정의하기
  7. 파이썬 프로젝트 실습
    1. 원카드 게임 만들기 (1)
    2. 원카드 게임 만들기 (2)
    3. 원카드 게임 만들기 (3) (작성중)
    4. 턴제 자동 전투 게임 만들기 (작성중)
  8. 실전 (파이썬 외적인 것들)
    1. 정규표현식 – 문자열을 검색하고 치환하기 (작성중)
    2. 유니코드 – 컴퓨터에서 문자를 표기하는 방법
    3. html, css, 인터넷 – 자동화 첫 걸음 내딛기
    4. 네트워크 – 인터넷으로 통신하는 방법
    5. 문서 – 문맥을 읽어보기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Scroll to top