개발 잡기술

파이썬 input 한 줄로 쓰기 - 객체 unpacking * 사용

Danna 다나 2024. 3. 6. 23:20
728x90
반응형

항상 input을 받아서 객체에 할당하고자 할 때 코드를 이런 식으로 썼었다.

class Student:
    def __init__(self, height, weight):
        self.height = height
        self.weight = weight

N = int(input())
students = []
for i in range(N):
    h, w = input().split()
    students.append(Student(h, w))

N을 받고, 객체를 저장할 리스트를 선언 및 초기화하고, for문을 통해 input을 받은 후 리스트에 객체를 추가하는 방식이었다.

 

아무리 생각해도 간단히 쓸 수 있을 거 같은데, 파이썬에 익숙하지 않아서 알고리즘 문제들을 풀면서 관성적으로 이렇게 긴 코드를 쓰다가 오늘 드디어 간략히 쓰는 법을 찾아봤다.
생각보다 더 간단했다.

N = int(input())
students = [Student(*input().split()) for _ in range(N)]

이렇게 쓸 수 있다.

 

여기서 * 연산자는 Python에서 unpacking 연산자로 사용된다.

함수에 인자를 전달할 때, 이 연산자를 사용하면 시퀀스(예: 리스트, 튜플 등)의 각 항목을 개별적인 인자로 분리하여 전달할 수 있다.

*를 사용하면, 리스트나 튜플 내의 요소들이 함수의 파라미터로 하나씩 풀어져서 전달되는 것이다.

 

예를 들어, input().split()은 사용자 입력을 받아 공백을 기준으로 분리하여 리스트를 생성한다.

만약 사용자가 "170 60"이라고 입력하면, input().split()은 ["170", "60"]이라는 리스트를 반환한다.

이 리스트를 Student 클래스의 생성자에 직접 전달하려면 각 요소를 개별 인자로 분리해야 하는데, 여기서 * 연산자가 사용된다.

 

Student(*input().split())라고 작성하면,

input().split()으로 생성된 리스트의 요소들이 Student 클래스 생성자의 height와 weight 파라미터로 각각 풀려서 전달된다.

즉, Student("170", "60")으로 호출되는 것과 동일한 효과를 가진다.

 

아래는 int로 캐스팅, id까지 추가된 최종적으로 문제 푸는 데 사용한 버전

class Student:
    def __init__(self, height, weight, id):
        self.height = height
        self.weight = weight
        self.id = id

N = int(input())
students = [Student(*map(int, input().split()), i+1) for i in range(N)]
728x90
반응형