ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코딩도장] day6. 시퀀스 자료형(3) - 슬라이스
    IT/파이썬 2020. 8. 9. 21:38

    ■ 들어가기

    - 파이썬 코딩 도장 (남재윤/길벗). 을 공부하며 정리하는 블로그


    ▶ Unit11. 시퀀스 자료형 활용하기

         - 11.4 슬라이스 사용하기

     

    1. 슬라이스

    - 시퀀스 객체의 일부를 잘라내는데 사용

    - 사용법: 시퀀스객체[시작인덱스:끝인덱스]

      주의1) "끝인덱스"는 가져오려는 범위에 포함되지 않으므로 실제 가져오려는 인덱스보다 +1 지정 필요

      주의2) 시작인덱스와 끝인덱스가 같다면 아무 값도 가져오지 않음

    >>> a = list(range(0,100,10))
    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[0:4]      # 인덱스 0부터 3까지 잘라서 새 리스트를 만듦
    [0, 10, 20, 30]
    >>>
    >>> a[1:1]      # 시작인덱스와 끝인덱스가 같으면 결과값 없음.
    []

     

    2. 리스트의 중간 부분 가져오기

    - 리스트 중간 부분 가져오기

    - 음수 인덱스 지정하여 리스트 중간 부분 가져오기

    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[4:7]      # 인덱스 4부터 6까지 요소 3개를 가져옴
    [40, 50, 60]
    >>>
    >>> a[4:-1]     # 인덱스 4부터 -2까지 요소 5개를 가져옴
    [40, 50, 60, 70, 80]

     

    3. 인덱스 증가폭 사용하기

    - 사용법: 시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭]

      주의) "인덱스의 증가폭"일 뿐이지 요소의 값 증가폭이 아님!

    - 증가한 인덱스가 끝인덱스와 일치한다면 해당 인덱스까지 가져옴

    >>> a = list(range(0,100,10))
    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[2:8:3]    # 인덱스 2부터 3씩 증가시키면서 인덱스 7까지 가져옴
    [20, 50]
    >>> a[2:9:3]    # 인덱스 2부터 3씩 증가시키면서 인덱스 8까지 가져옴 (2, 5, 8)
    [20, 50, 80]

     

    4. 인덱스 생략하기

    - 시퀀스 객체의 길이를 몰라도 되기 때문에 자주 사용되며, 주로 시퀀스 객체의 마지막 일부분만 출력 시 사용

    - 사용법1: 시퀀스객체[:끝인덱스]

      └ 리스트의 처음부터 "끝인덱스-1" 까지 가져옴

    - 사용법2: 시퀀스객체[시작인덱스:]

      └ 시작인덱스부터 "마지막 요소"까지 가져옴

    - 사용법3: 시퀀스객체[:]

      └ "리스트 전체"를 가져옴

    >>> # 사용법1
    ... a = list(range(0,100,10))
    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[:7]       # 리스트 처음부터 인덱스 6까지 가져옴
    [0, 10, 20, 30, 40, 50, 60]
    >>>
    >>> # 사용법2
    ... a[7:]       # 인덱스 7부터 마지막 요소까지 가져옴
    [70, 80, 90]
    >>>
    >>> # 사용법3
    ... a[:]        # 리스트 전체를 가져옴
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

     

    5. 인덱스 생략하면서 증가폭 사용하기

    - 사용법1: 시퀀스객체[:끝인덱스:증가폭]

      └ 리스트의 처음부터 인덱스를 '증가폭'만큼 증가시키면서 "끝인덱스-1" 까지 요소를 가져옴

    - 사용법2: 시퀀스객체[시작인덱스::증가폭]

      └ 시작인덱스부터 인덱스를 '증가폭'만큼 증가시키면서 "리스트의 마지막 요소"까지 가져옴

    - 사용법3: 시퀀스객체[::증가폭]

      └ "리스트 전체"에서 인덱스를 '증가폭'만큼 증가시키면서 요소를 가져옴

      └ 증가폭을 생략하면 "리스트 전체"를 가져옴 (a[:] == a[::] 결과 동일)

    >>> # 사용법1
    ... a = list(range(0,100,10))
    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[:7:2]     # 리스트의 처음부터 인덱스를 2씩 증가시키면서 인덱스 6까지 가져옴
    [0, 20, 40, 60]
    >>>
    >>> # 사용법2
    ... a[7::2]     # 인덱스 7부터 2씩 증가시키면서 리스트의 마지막 요소까지 가져옴
    [70, 90]
    >>>
    >>> # 사용법3
    ... a[::2]      # 리스트 전체에서 인덱스 0부터 2씩 증가시키면서 요소를 가져옴
    [0, 20, 40, 60, 80]
    >>>
    >>> # 번외 1
    ... a[:]
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[::]
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> # 번외2

    ... a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[5:1:-1]   # 인덱스 5부터 2까지 1씩 감소시키면서 요소를 가져옴
    [50, 40, 30, 20]

     

    6. 튜플, range, 문자열에 슬라이스 사용하기

    6.1 튜플

    - 사용법1: 튜플[시작인덱스:끝인덱스]

    - 사용법2: 튜플[시작인덱스:끝인덱스:인덱스증가폭]

    >>> b = tuple(range(0,100,10))
    >>> b
    (0, 10, 20, 30, 40, 50, 60, 70, 80, 90)
    >>> b[4:7]      # 인덱스 4부터 6까지 요소 3개를 가져옴
    (40, 50, 60)
    >>> b[4:]       # 인덱스 4부터 마지막 요소까지 가져옴
    (40, 50, 60, 70, 80, 90)
    >>> b[:7:2]     # 튜플의 처음부터 인덱스를 2씩 증가시키면서 인덱스 6까지 가져옴
    (0, 20, 40, 60)

    6.2 range

    - range에 슬라이스를 사용하면 지정된 범위의 숫자를 생성하는 range객체를 새로 생성

    - 사용법1: range객체[시작인덱스:끝인덱스]

    - 사용법2: range객체[시작인덱스:끝인덱스:인덱스증가폭]

    >>> r = range(10)
    >>> r
    range(0, 10)
    >>> r[4:7]      # 인덱스 4부터 6까지 숫자 3개를 생성하는 range 객체를 만듦
    range(4, 7)
    >>> r[4:]       # 인덱스 4부터 9까지 숫자 6개를 생성하는 range 객체를 만듦
    range(4, 10)
    >>> r[:7:2]     # 인덱스 0부터 2씩 증가시키면서 인덱스 6까지 숫자 4개를 생성하는 range 객체를 만듦
    range(0, 7, 2)

    - range는 리스트, 튜플과 달리 요소가 모두 표시되지 않고 생성 범위만 표시됨

    - 위와 같이 잘라낸 range 객체를 리스트로 만들려면 list에 넣으면 됨! (튜플도 동일)

    >>> list(r[:7:2])
    [0, 2, 4, 6]
    >>> tuple(r[:7:2])
    (0, 2, 4, 6)

    6.3 문자열

    - 문자열은 문자 하나하나가 요소이므로 문자 단위로 잘라서 새 문자열을 만듦

    - 사용법1: 문자열[시작인덱스:끝인덱스]

    - 사용법2: 문자열[시작인덱스:끝인덱스:인덱스증가폭]

    >>> hello = 'Hello, World!'
    >>> hello[2:9]  # 인덱스 2부터 8까지 잘라서 문자열을 만듦
    'llo, Wo'
    >>> hello[2:]   # 인덱스 2부터 마지막 요소까지 잘라서 문자열을 만듦
    'llo, World!'
    >>> hello[:9:2] # 문자열의 처음부터 인덱스를 2씩 증가시키면서 인덱스 8까지 잘라서 문자열을 만듦
    'Hlo o'

     

    7. 슬라이스에 요소 할당하기

    - 시퀀스 객체는 슬라이스로 범위를 지정하여 여러 요소에 값을 할당 가능

    - 사용법: 시퀀스객체[시작인덱스:끝인덱스] = 시퀀스객체

      └ 원래 있던 리스트가 변경되며 새 리스트는 생성되지 않음

      └ 범위와 할당하려는 값의 개수가 다르면 해당 개수만큼만 할당됨

      └ 반대로 범위보다 할당하려는 값의 개수가 많으면 범위를 벗어나 값이 할당됨

    >>> a = list(range(0,100,10))
    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[2:5] = ['a','b','c']      # 인덱스 2부터 4까지 값 할당
    >>> a
    [0, 10, 'a', 'b', 'c', 50, 60, 70, 80, 90]
    >>> a[2:5] = ['a']      # 인덱스 2부터 4까지에 값 1개를 할당
    >>> a
    [0, 10, 'a', 50, 60, 70, 80, 90]
    >>> a[2:5] = ['a','b','c','d','e']      # 인덱스 2부터 4까지 값 5개를 할당(요소의 개수가 늘어남)
    >>> a
    [0, 10, 'a', 'b', 'c', 'd', 'e', 70, 80, 90]

    7.1 인덱스 증가폭을 지정하여 슬라이스에 값 할당하기

    - 사용법: 시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭] = 시퀀스객

    >>> a = list(range(0,100,10))
    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[2:7:2] = ['a','b','c']    # 인덱스 2부터 2씩 증가시키면서 인덱스 6까지 값 할당
    >>> a
    [0, 10, 'a', 30, 'b', 50, 'c', 70, 80, 90]

    - 앞선 '슬라이스 값 할당하기'와 달리 '인덱스 증가폭' 지정했을 때는 슬라이스 범위의 요소 개수와 할당할 요소 개수가 정확히 일치해야하며, 그렇지 않으면 에러!

    - 튜플, range, 문자열은 슬라이스 범위 지정하더라도 요소 할당 불가!

    >>> a = list(range(0,100,10))
    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> a[2:8:2] = ['a','b']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ValueError: attempt to assign sequence of size 2 to extended slice of size 3

     

    8. del 로 슬라이스 삭제하기

    - 사용법: del 시퀀스객체[시작인덱스:끝인덱스]

    - del로 요소를 삭제하면 원래 있던 리스트가 변경되며 새 리스트는 생성되지 않음

    >>> a = list(range(0,100,10))
    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> del a[2:5]  # 인덱스 2부터 4까지 요소를 삭제
    >>> a
    [0, 10, 50, 60, 70, 80, 90]

    - 인덱스 증가폭 지정 시, 인덱스를 건너뛰면서 삭제함~

    >>> a = list(range(0,100,10))
    >>> a
    [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    >>> del a[2:8:2]        # 인덱스 2부터 2씩 증가시키면서 인덱스 6까지 삭제
    >>> a
    [0, 10, 30, 50, 70, 80, 90]

    - 튜플, range, 문자열은 del로 슬라이스 삭제 불가!

    댓글

Designed by Tistory.