DL Study

[파이썬에서 살아남는법 제 5장] 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹 하라

형혹성 2023. 1. 12. 18:17

※본 내용은 파이썬의 코딩 기술 (개정 2판)을 바탕으로 작성 했습니다.

 

파이썬에는 불변의 순서쌍을 만드는 tuple 기능이 있다.

snack_calories = {
    'chips': 140,
    'popcorn': 80,
    'nuts': 190,
}
items = tuple(snack_calories.items())
print(items)
>>>
(('chips', 140), ('popcorn', 80), ('nuts', 190))

딕셔너리의 키-값과 비슷하게 두값으로 구성되어 있다. 

튜플의 값은 숫자 인덱슬르 사용해 접근할수 있다.

item = ('Peanut butter', 'Jelly')
first = item[0]
second = item[1]

튜플은 일단 생성되면 인덱스로 수정이나 변경이 안된다.

하지만 파이썬에는 언패킹 구문이 있다. 언패킹 구문을 사용하면 문장 안에서 여러값을 대입할 수 있다.

언패킹은 튜플 인덱스를 사용하는것보다 가시성이 좋다. 리스트, 시퀀스, 이터러블 안에 여러 계층으로 이리터블이 들어간경우 등 다양한 경우에 사용이 가능하다. 

item = ('Peanut butter', 'Jelly')
first, second = item # 언패킹
print(first, 'and', second)
>>>
Peanut butter and Jelly
favorite_snacks = {
    'salty': ('pretzels', 100),
    'sweet': ('cookies', 180),
    'veggie': ('carrots', 20),
}

((type1, (name1, cals1)),
(type2, (name2, cals2)),
(type3, (name3, cals3))) = favorite_snacks.items()    #언패킹

인덱스 구문과 언패킹 구문의 비교

#인덱스 구문
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 = ['pretzels', 'carrots', 'arugula', 'bacon']
bubble_sort(names)
#언패킹 구문
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 = ['pretzels', 'carrots', 'arugula', 'bacon']
bubble_sort(names)

우항의 (a[i], a[i-1])이 계산되고, 그결과값이 새로운 tuple 에 저장된다. 그후 좌항에 있는 언패킹패턴(a[i-1], a[i]) 을 통해서 임시 튜플의 값이 각각 저장된다. 따라서 0번의 인덱스의 pertzels 는 carrots 로 바뀌고 1번 인덱스의 carrots 는 pretzels 로 바
뀐다.

이러한 언패킹은 리스트 에도 적용 할수 있다. 

# Itration 코드
snacks = [('bacon', 350), ('donut', 240), ('muffin', 190)]
for i in range(len(snacks)):
    item = snacks[i]
    name = item[0]
    calories = item[1]
    print(f'#{i+1}: {name} has {calories} calories')
#언패킹 코드
for rank, (name, calories) in enumerate(snacks, 1):
    print(f'#{rank}: {name} has {calories} calories')

언패킹을 현명하게 사용한다면 가능한 인덱스 사용을 피할수 있고, 더 명확하고 파이썬다운 코드를 만들수 있다.

 

 

 

 

 

 

 

 

 

1