EXCELSIOR

BETTER WAY 5 - 시퀀스를 슬라이스하는 방법을 알자 본문

Python/Effective Python

BETTER WAY 5 - 시퀀스를 슬라이스하는 방법을 알자

Excelsior-JH 2018. 1. 29. 00:41

BETTER WAY 5 - 시퀀스를 슬라이스하는 방법을 알자

Item05 - Know How to Slice Sequences


  • Python은 시퀀스를 슬라이스(slice: 자르기)해서 조각으로 만드는 문법을 제공한다.
  • 이렇게 슬라이스를 이용하면 시퀀스(sequence)의 부분집합(subset)에 접근할 수 있다.
  • list, str, bytes에서 슬라이스를 이용할 수 있다.
  • Slicing 문법은 somelist[start:end] 이며, start인덱스는 포함되고 end인덱스는 제외된다.
1
2
3
4
5
6
7
8
9
10
11
= ['a''b''c''d''e''f''g''h']
 
print('First four:', a[:4])
print('Last four:', a[-4:])
print('Middle two:', a[3:-3])
 
'''출력결과
First four: ['a', 'b', 'c', 'd']
Last four: ['e', 'f', 'g', 'h']
Middle two: ['d', 'e']
'''
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# list의 처음부터 슬라이스할 때는 0을 생략한다.
# 아래의 코드에서 assert는 condition이 일치하지 않을 때 예외를 반환한다.
assert a[:5== a[0:5]
 
# 마찬가지로 list의 끝까지 슬라이스 할 때도 마지막 인덱스는 넣지 않아도 된다.
assert a[5:] == a[5:len(a)]
 
# list의 끝을 기준으로 오프셋 계산을 할 때는 음수로 슬라이스를 하는게 편하다.
print(a[:])
print(a[:5])
print(a[:-1])
print(a[4:])
print(a[-3:])
print(a[2:5])
print(a[2:-1])
print(a[-3:-1])
 
'''출력결과
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
['a', 'b', 'c', 'd', 'e']
['a', 'b', 'c', 'd', 'e', 'f', 'g']
['e', 'f', 'g', 'h']
['f', 'g', 'h']
['c', 'd', 'e']
['c', 'd', 'e', 'f', 'g']
['f', 'g']
'''
cs


1
2
3
4
5
6
7
8
9
10
11
# 슬라이싱은 start와 end 인덱스가 리스트의 경계를 벗어나더라도 
# 자동으로 적절하게 처리해준다.
first_twenty_items = a[:20]
last_twenty_items = a[-20:]
print('first_twenty_items=', first_twenty_items)
print('last_twenty_items=', last_twenty_items)
 
'''출력결과
first_twenty_items= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
last_twenty_items= ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
'''
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 슬라이싱의 결과는 새로운 리스트를 반환한다.
= a[4:]
print('Before:    ', b)
b[1= 99
print('After:     ', b)
print('No change: ', a)
 
'''출력결과
Before:     ['e', 'f', 'g', 'h']
After:      ['e', 99, 'g', 'h']
No change:  ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
'''
 
cs


1
2
3
4
5
6
7
8
9
10
11
# list에 새로운 값을 할당할 경우 슬라이스 할당의 길이는 달라도 된다.
# list는 새로 들어온 값에 맞춰 늘어나거나 줄어들기 때문이다.
print('Before:   ', a)
a[2:7= [992214]
print('After:    ', a)
 
'''출력결과
Before:    ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
After:     ['a', 'b', 99, 22, 14, 'h']
'''
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 슬라이스에 start와 end 인덱스를 지정하지 않고 할당하면 
# 리스트의 전체 내용을 참조 대상의 복사본으로 대체한다.
= a
print('Before:  ', a)
a[:] = [101102103]
assert a is b
print('After:   ', b)
 
 
'''출력결과
Before:   ['a', 'b', 99, 22, 14, 'h']
After:    [101, 102, 103]
'''
 
cs


정리

  • start 인덱스에 0을 설정하거나 end인덱스에 시퀀스의 길이를 설정하지 말자. somelist[:end], somelist[start:]
  • 슬라이싱은 범위를 벗어난 start나 end 인덱스를 허용한다.
  • list 슬라이스에 할당하면 원본 시퀀스에 지정한 범위를 참조 대상의 내용으로 대체한다.


Comments