본문 바로가기
프로그래밍/Python 관련 정보

[Python Programming 기초] 부분 unpacking

by 물박사의 저장공간 2024. 10. 22.

 

 

 

 

 

 

 

 

 

 

 

tuple, list, set의 unpacking은 *를 이용해서 합니다. 

dictionary는 **를 이용해서 합니다. (만약 *를 쓴다면 key만 unpack됩니다)

numbers = [1, 2, 3, 4, 5]

# 첫 번째 값과 마지막 값을 변수에 할당하고, 중간 값들을 `rest` 리스트로 묶음
first, *rest, last = numbers

print(first)  # 출력: 1
print(rest)   # 출력: [2, 3, 4]
print(last)   # 출력: 5

 

이 부분 unpacking을 함수의 가변인자를 나타내는데도 활용할 수 있습니다. 가변인자란 함수에 전달할 인자의 개수를 고정하지 않고, 유연하게 여러 개의 인자를 받을 수 있도록 하는 방법입니다. 가변 인자는 두 가지 형태로 사용할 수 있습니다

  1. *args: 위치 인자를 가변적으로 받는 방식
  2. **kwargs: 키워드 인자를 가변적으로 받는 방식

사실 이름을 꼭 args, kwargs로 할 필요는 없는데, 관습적으로 이렇게 많이 이름을 붙입니다. 

def display_info(*args, **kwargs):
    print("Positional arguments:", args)
    print("Keyword arguments:", kwargs)

# 호출 예시
display_info(1, 2, 3, name="Alice", age=25)
# 출력:
# Positional arguments: (1, 2, 3)
# Keyword arguments: {'name': 'Alice', 'age': 25}

 

이 unpacking 스킬(?)을 이용하면 2차원 list의 transpose값도 쉽게 계산할 수 있는데요, 다음 코드는 l이라는 list가 있을 때, 행별 합계/열별 합계를 구하는 코드입니다. 

row_list = [sum(row) for row in l]
col_list = [sum(col) for col in zip(*l)]

 

처음 볼 때는 이 코드가 조금 난해하게 느껴질 수도 있는데요, 아래 그림을 한번 볼까요?

2차원 list는 원소 자체가 list(주황색)입니다. unpacking 연산을 하게되면 이 각각의 (원소) list가 unpacking 되는데 이렇게 unpacking된 상태에서 zip이라는 명령어를 쓰게되면 각각 동일한 위치에 대응되는 것끼리 그룹핑이 되는 것이죠. for loop를 이용해서 이 문제를 해결했더라면 꽤나 복잡해 졌을 코드를 이렇게 쉽게 작성할 수 있는 것입니다. 


관련 문제를 하나 풀어보겠습니다. 

N*N 배열에서 각 요소에 정수가 들어 있다. 이 배열에서 합이 가장 큰 행과 열의 번호를 각각 인쇄하라.

 

n = int(input())
mat = [list(map(int, input().split())) for _ in range(n)]
# print([sum(row) for row in mat])
rs_i, cs_i = (max([(i, sum(row)) for i, row in enumerate(mat, 1)], key=lambda x:x[1])
              , max([(j, sum(col)) for j, col in enumerate(zip(*mat), 1)], key=lambda x:x[1]))
print(rs_i[0], cs_i[0])

 


2차원 배열의 90도 회전

mat = [[x for x in input().split()] for i in range(int(input()))]
angle = int(input())
 
 
def rotate90(m):
    return list(zip(*m[::-1]))