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을 함수의 가변인자를 나타내는데도 활용할 수 있습니다. 가변인자란 함수에 전달할 인자의 개수를 고정하지 않고, 유연하게 여러 개의 인자를 받을 수 있도록 하는 방법입니다. 가변 인자는 두 가지 형태로 사용할 수 있습니다
- *args: 위치 인자를 가변적으로 받는 방식
- **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]))
'프로그래밍 > Python 관련 정보' 카테고리의 다른 글
[Python Programming 기초] Eval/Exec함수 (0) | 2024.10.25 |
---|---|
[Python Programming 기초] Formatted string (2) | 2024.10.24 |
[Python Programming 기초] Dictionary (3) | 2024.10.22 |
[Python Programming 기초] Comprehension (2) | 2024.10.22 |
[Python Programming 기초] Iterator (0) | 2024.10.20 |