인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹 하라

Minsang Yu·2023년 6월 6일
0

5. 인덱스를 사용하는 대신 대입을 사용해 데이터를 언패킹 하라

파이썬에는 값으로 이뤄진 불변 순서쌍을 만들어낼 수 있는 tuple 내장 타입이 있다. 가장 짧은 튜플은 딕셔너리의 키 - 갓 쌍과 비슷하게 두 값으로 이뤄진다.

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

>>>
(('감자칩', 140), ('팝콘', 80), ('땅콩', 190))

# 튜플에 있는 값은 숫자 인덱스를 사용해 접근할 수 있다.
item = ('호박엿', '식혜')
firlst = item[0]
second = item[1]
print(first, '&', second)

>>>
호박엿 & 식혜
## 일단 튜플이 만들어 지면 대입을 통해 튜플의 값을 변경할 수 없다.

파이썬에는 언패킹 구문이 있다.

언패킹 구문을 사용하면 한 문장 안에서 여러 값을 대입하 수 있다.

언패킹(Unpacking)은 파이썬에서 데이터 구조(예: 리스트, 튜플, 사전)의 요소를 개별 변수에 할당하는 과정을 말합니다. 기본적으로 언패킹은 데이터 구조의 각 요소를 변수에 할당하기 위해 대입 연산자(=)를 사용하는 것입니다.

# 언패킹 예제 
item = ('호박엿', '식혜')

first, second = item # 언패킹
print( first, '&', second)
>>>
호박엿 & 식혜 # 언패킹을 활용한 출력 

언패킹 활용 1. 임시 변수를 정의하지 않고도 값을 맞바꿀수 있다.

기존의 언어는 값을 맞바꾸려면 임시변수를 정의한 후 바꿀값을 임시변수에 저장한 후 값을 바꾸지만 파이썬의 언패킹 기능을 사용하면 임시변수를 사용하지 않고도 값을 맞 바꿀수 있다.

# 기존의 버블 소트 임시변수를 선언후 바꿈
def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                temp = arr[j+1]
								arr[j+1] = arr[j]
								arr[j] = temp
# 언패킹을 활용한 버블소트
def bubble_sort_unpacking(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]  # 언패킹을 활용하여 값 교환

어떻게 이런 맞바꾸기가 가능하냐면 우선 대입문 우항 이 계산되고 그결괏값이 이름이 없는 새로운 tuple 에 저장된다. 그 후 대입문 좌항에 있는 언패킹 패턴 (arr[j], arr[j+1]) 을 통해 임시 tuple에 있는 값이 a[i-1]과 a[i]라는 변수에 각각 저장된다.


언패킹 활용 2. for 루프 또는 컴프리헨션의 대상인 리스트이 원소를 언패킹

# 언패킹을 사용하지 않는 list를 언패킹 하는 코드 
snack = [('베이컨', 350), ('도넛', 240), ('머핀', 190)]
for i in range(len(snack)):
	item = snack[i]
	name = item[0]
	calories = item[1]
	print(f"#{i+1}: {name}{calories} 칼로리입니다.")

코드는 잘 작동하지만 가독성이 좋지않다.

# enumerate 내장 함수와 언패킹을 사용한 코드
for rank, (name, calories) in enumerate(snacks, 1):
	print(f"#{rank}: {name}{calories} 칼로리입니다.")

이런식의 루프가 필요할 떄 이 방법이 파이썬다운 방식이다 코드가 짧고 이해하기 쉽다. 일반적으로 인덱스를 사용해 무언가에 접근할 필요하 전혀 없다.

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


정리

  • 파이썬은 한 문장 안에서 여러 값을 대입할 수 있는 언패킹이라는 특별한 문법을 제공한다.
  • 파이썬 언패킹은 일반화돼 있으므로 모든 이터러블에 적용할 수 있다. 그리고 이터러블이 여러 계층으로 내포된 경우에도 언패킹을 적용할 수 있다.

Reference. Effective Python

profile
Jr. DataEngineer

0개의 댓글