Batter way 11

매일 공부(ML)·2022년 2월 5일
0

파이썬 코딩의 기술

목록 보기
10/27

시퀀스 슬라이싱하는 방법 익혀라

  • 슬라이싱을 사용하면 최소한의 노력으로 시퀀스에 들어있는 아이템의 부분집합을 접근하기 쉽다.

  • 어떤 파이썬 클래스에도 슬라이싱 추가 가능

  • 특별 메서드 구현

    • getitem , __setitem
  • 슬라이싱 구분: 리스트[시작:끝]

  • 시작 인덱스에 있는 원소는 슬라이스에 포함되지만, 끝 인덱스에 있는 원소는 포함되지 않는다.

a = ['a' , 'b', 'c', 'd', 'e', 'f', 'g', 'h']

print('가운데 2개:', a[3:5] # 가운데 2개: ['d', 'e']
print('마지막을 제외한 나머지:', a[1:7] ) #마지막을 제외한 나머지; ['b','c','d','e','f','g']
  • 리스트의 맨 앞부터 슬라이싱할 때 시각적 잡음을 없애기 위해 0을 생략
assert a[:5] == a[0:5]

  • 리스트의 끝까지 슬라이싱할 때는 쓸데없이 끝 인덱스 적지 말기
assert a[5:] == a[5:len(a)]
  • 리스트의 끝에서부터 원소를 찾고 싶을 때 음수 인덱스 사용
a[-3:] # ['f','g','h']
  • 입력 시퀀스를 다룰 때 원하는 최대 길이 정하기
first_twenty_items = a[:20]
last_twenty_items = a[-20:]

  • 리스트를 슬라이싱한 결과는 완전한 새로운 리스트이고, 원래 리스트에 대한 참조는 그대로 유지

  • 슬라이싱한 결과로 얻은 리스트를 변경해도 원래 리스트 바뀌지 않는다.

b = a[3:]
print('이전:', b) #이전: ['d', 'e', 'f', 'g', 'h']
b[1] = 99
print('이후:', b) #이후: ['d',99,'f','g','h']
print('변화 없음:', b) #변화없음: ['a','b','c','d','e','f','g','h']

대입에 슬라이스를 사용할 경우, 원본 리스트에서 지정한 범위에 들어 있는 원소를 변경하고, 언패킹 대입과 달리 슬라이스와 대입되는 리스트의 길이가 같을 필요가 없다.

대입된 슬라이스 이전이나 이후에 있던 원소들은 그대로 유지가되지만, 리스트에 지정한 슬라이스 길이보다 대입되는 배열의 길이가 더 짧기에 리스트가 줄어듭니다.

print('이전:' , a) #이전: ['a','b','c','d','e','f','g','h']
a[2:7] = [99,22,14] 
print('이후', a) #이후: ['a','b',99,22,14,'h']

  • 리스트에 지정한 슬라이스 길이보다 대입되는 배여르이 길이가 더 길면 리스트가 늘어납니다.
print('이전:', a) #이전: ['a','b',99,22,14,'h']
a[2:3] = [47,11]
print('이후:', a) #이후: ['a','b',47,11,22,14'h']
  • 슬라이싱에서 시작과 끝 인덱스를 모두 생략 시 원래 리스트를 복사한 새 리스트를 얻습니다.
b = a[:]
assert b==a and b is not a

시작과 끝 인덱스가 없는 슬라이스에 대입하면 슬라이스가 참조하는 리스트의 내용을 대입하는 리스트의 복사본을 덮어 씁니다.

b = a
print('이전 a:', a) #이전 a: ['a','b',47,11,22,14,'h']
print('이전 b:', b) #이후 b: ['a','b',47,11,22,14,'h']

a[:] = [101, 102, 103]
assert a is b #여전히 같은 리스트 객체
print('이후 a:', a) # 새로운 내용이 들어 있음, 이후 a: [101,102,103]
print('이후 b:', b) #같은 리스트 객체이기에 a와 내용이 같음, 이후 b: [101,102,103]

정리

  • 슬라이싱을 간결하게 하라

    • 시작 인덱스에 0을 넣거나 끝 인덱스에 시퀀스 길이 넣지 말 것
  • 슬라이싱은 범위를 넘어가는 시작 인덱스나 끝 인덱스도 허용한다.

  • 리스트 슬라이스에 대입하면 원래 시퀀스에서 슬라이스가 가리키는 부분을 대입 연산자 오른쪽에 있는 시퀀스로 대치하고 길이가 달라도 됩니다

profile
성장을 도울 아카이빙 블로그

0개의 댓글