Batter way06 인덱스를 사용하는 대신 대입을 사용해서 데이터 언패킹하기

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

인덱스 사용

파이썬에는 tuple을 사용하면 값으로 이뤄진 불변의 순서쌍을 만들어 내고, 가장 짧은 튜플은 딕셔너리의 키-값 쌍과 비슷하게 두 값으로 이뤄집니다.

*예시1

snack_calories = {
    '감자칩': 140,
    '팝콘': 80,
    '땅콩': 190,
}
items = tuple(snack_calories.items())
print(items) #(('감자칩', 140), ('팝콘', 80), ('땅콩', 190))

*예시2(튜플에 있는 값은 숫자 인덱스 사용하여 접근 가능)

item = ('호박엿', '식혜')
first = item[0]
second = item[1]
print(first, '&', second) #호박엿 & 식혜

*예시3(튜플이 만들어지면 새 값을 대입해서 튜플 변경 없다)

pair = ('약과', '호박엿')

pair[0] = '타래과'

#Error

Traceback...
TypeError: 'tuple' object does not support item assignment

언패킹 구문

  • 한 문장 안에서 여러 값 대입 가능

  • 인덱스를 사용하는 것이 아닌 튜플을 두 변수 이름으로 이뤄진 튜플에 대입

item = ('호박엿', '식혜')
first, second = item #언패킹
print(first,'&', second) # 호박엿 & 식혜
  • 시각적 잡음이 적다

  • 리스트, 시퀀스, 이터러블 안에 여러 계층이 들어간 경우에도 사용 가능

  • 임시 변수 사용 안해도 값을 맞 바꿀 수 있다.


*예시2: 비교하기(언패킹 이용x)

#임시 변수를 사용해서 list의 두 위치 변경

def bubble_sort(a):
    for _ in range(len(a)):
        for i in range(1, len(a)):
            if a[i] < a[i-1]:
                temp = a[i]
                a[i] = a[i-1]
                a[i-1] = temp
              
names = ['프레즐', '당근', '쑥갓', '베이컨']
bubble_sort(names)
print(names) #['당근', '베이컨', '쑥갓', '프레즐']

*예시2-1: 언패킹 이용

#언패킹 구문을 사용하여 한 줄로 두 인덱스가 가리키는 원소 바꾸기

# 언패킹 패턴(a[i-1]. a[i])을 통해 임시 튜플에 있는 값이 a[i-1], a[i]에 각각 저장이 된다.

def bubble_sort(a):
    for _ in range(len(a)):
        for i in range(1, len(a)):
            if a[i] < a[i-1]: 
                a[i-1], a[i] = a[i], a[i-1] # 맞바꾸기
                
names = ['프레즐', '당근', '쑥갓', '베이컨']
bubble_sort(names)
print(names) #['당근', '베이컨', '쑥갓', '프레즐']

  • for루프, 컴프리헨션, 제너레이터 식의 대상인 리스트 원소 언패킹 가능

*예시1

# 언패킹 사용하지 않고 list에 대해 이터레이션 코드

snacks = [('베이컨', 350), ('도넛', 240), ('머핀', 190)]
for i in range(len(snacks)):
    item = snacks[i]
    name = item[0]
    calories = item[1]
    print(f'#{i+1}: {name} 은 {calories} 칼로리입니다.')

#결과

#1: 베이컨 은 350 칼로리입니다.
#2: 도넛 은 240 칼로리입니다.
#3: 머핀 은 190 칼로리입니다.

*예시2

#언패킹을 사용하기
#enumerate 내장 함수 이용

for rank, (name, calories) in enumerate(snacks, 1):
    print(f'#{rank}: {name} 은 {calories} 칼로리입니다.')
    
#결과

#1: 베이컨 은 350 칼로리입니다.
#2: 도넛 은 240 칼로리입니다.
#3: 머핀 은 190 칼로리입니다.

파이썬다운 방식

  • 코드가 짧고 이해가 쉽다

  • 인덱스를 사용에 접근할 이유가 없다

  • 언패킹 기능 제공

    • list구조
    • 함수인자
    • 키워드인자
    • 다중 반환 값

정리
  • 파이썬은 한 문장 안에서 여러 값을 대입하는 게 가능한 언패킹이라는 문법 제공

  • 파이썬 언패킹은 모든 이터러블에 적용 가능

    • 이터러블이 여러 계층으로 내포되어 있어도 적용 가능
  • 인덱스를 사용해 시퀀스 내부에 접근하는 대신 언패킹 사용하면 시각적 잡은 줄이고 코드 더 명확

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

0개의 댓글