list 완벽 정복!

About_work·2023년 1월 18일
0

python 기초

목록 보기
8/65

list

언제 써야해?

  • mutable (동적인/가변적인) 데이터 관리

언제 쓰지 말아야 해?

  • immutable 한 데이터 관리 시
  • 파이썬 리스트는 무겁다. (이유: 동적배열 + 가변성)

sequence slicng

  • slicing
a = [0,1,2,3,4,5]
a[-3:] -> [3,4,5]
a[-3:-1] -> [3, 4]
  • sequence를 여러 조각으로 나누는 구문

  • 어떤 파이썬 class에도 slicing을 추가할 수 있다.

    • __getitem____setitem__ 특별 method를 구현하면 된다.
  • slicing 할 때, 리스트의 index 범위를 넘어가는 시작과 끝 index는 조용히 무시된다.

  • 리스트(a)를 slicing 한 결과(=b) 는 완전히 새로운 리스트이며, b은 a에 대한 참조를 그대로 유지한다. b을 변경해도 a는 바뀌지 않는다.

a = [0,1,2,3,4,5]
b = a[3:] # [3, 4, 5]
b[1] = 99 # [3, 99, 5]

a -> [0, 1, 2, 3, 4, 5]
b -> [3, 99, 5]
  • 대입에 slice를 사용하면, 원본리스트에서 지정한 범위에 들어 있는 원소를 변경한다. slice 대입에서는 slice와 대입되는 리스트의 길이가 같을 필요가 없다.
a = [0,1,2,3,4,5]
a[2:3] = [10,11,12]
a -> [0, 1, 10, 11, 12, 3, 4, 5]

stride와 slice를 한 식에 함께 사용하지 마라

  • striding 이란?
    • 파이썬은 list[시작:끝:증가값] 으로 일정한 간격을 두고 slicing 할 수 있다.
    • slice에 시작, 끝, 증가값 3개를 동시에 쓰지 말라.
      • 세개 다 써야하면, 스트라이딩과 슬라이딩을 나눠서 2번에 처리하라.
      • 만약 이 두번 대입이 시간과 메모리가 많이 든다면, itertools 내장 모듈의 islice 메서드 를 사용하라.
    • 증가값(striding)에 음수를 쓰지 말라.

slicing 보다는, 나머지를 모두 잡아내는 unpacking을 사용하자.

  • 기본 unpacking(starred expression을 쓰지 않은)의 단점은 unpacking할 sequence의 길이를 미리 알고 있어야 한다는 점이다.
  • starred expression + unpacking은 매우 유용하다.
  • starred expression(*) 식의 결과는 항상 list 인스턴스가 된다.
  • unpacking 할 시퀀스에 남는 원소가 없으면 * 식 부분은 빈 list가 된다.
  • 하지만 별표 식은 항상 리스트를 만들어내기 떄문에, iterator을 계속 별표 식으로 unpacking 하면 컴퓨터 메모리를 모두 다 사용해서 프로그램이 멈출 수 있는지를 항상 체크해야 한다
car_ages = [0, 9, 4, 8, 7, 20, 19, 1, 6, 15]
car_ages_descending = sorted(car_ages, reverse=True)

# 권장하는 코드
oldest, second_oldest, *others = car_ages_descending
oldest, *others, youngest = car_ages_descending
*others, second_youngest, youngest = car_ages_descending

# 아래와 같이 하면 안된다.
oldest = car_ages_descending[0]
second_oldest = car_ages_descending[1]
others = car_ages_descending[2:]

# 아래와 같은 구문은 돌아가지 않는다. (Error)
*others = car_ages_descending
#first, *middle, *second_middle, last = [1, 2, 3, 4] (2개 이상 안됨)

# 아래는 * 가 2개지만, *이 서로 다른 부분에 포함되어 돌아간다.
car_inventory = {
    '시내': ('그랜저', '아반테', '티코'),
    '공항': ('제네시스 쿠페', '소나타', 'K5', '악센트'),
}

((loc1, (best1, *rest1)),
 (loc2, (best2, *rest2))) = car_inventory.items()
profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글