-
[코딩도장] 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 38. 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로 슬라이스 삭제 불가!
'IT > 파이썬' 카테고리의 다른 글
[코딩도장] day7. if문 (0) 2020.08.12 [코딩도장] day7. 딕셔너리 (0) 2020.08.12 [코딩도장] day5. 시퀀스 자료형(2) - len(), 인덱스, del (0) 2020.08.08 [코딩도장] day5. 파이썬 시퀀스 자료형(1) - in, +, * 연산자 (0) 2020.08.07 [코딩도장] day4. 리스트 (0) 2020.08.02