본문 바로가기
Python

[Python] Namedtuple 사용방법

by 까리한 새우 2025. 1. 22.

Namedtuple(네임드튜플)에 들어가기 앞서, 파이썬을 공부해보신 분들이라면 Tuple(튜플) 자료구조를 알고 계실 겁니다.

 

Tuple은 불변한 순서가 있는 Immutable 한 객체로, 한번 생성되면 값을 변경할 수 없습니다.

 

튜플은 튜플에 있는 요소를 접근할 때 순서를 기억해서 순서로 접근해야 한다는 단점이 있습니다.

 

또한, 파이썬을 공부할 때 분명히 배우는 자료형으로 Dictionary(딕셔너리)가 존재합니다.

Dictionary는 순서가 없는 key-value 쌍의 데이터 집합입니다.

 

Namedtuple은 이 둘의 장점을 모두 갖추고 있습니다.

 


 

Namedtuple 

 

namedtuple은 collections 모듈에서 제공됩니다.

 

namedtuple 은 클래스처럼 객체를 생성할 수 있으며 Tuple 처럼 Immutable(불변한) 타입이고 Dictionary 처럼 값에 대한 label 을 부여할 수 있습니다.

 

 

 

1. 정의 & 사용 방식

namedtuple은 약 4가지의 방식으로 정의하여 사용할 수 있습니다.

 

  • 리스트로 구분하여 정의
# namedtuple 선언
Book1 = namedtuple('Book', ['title', 'price'])

# namedtuple 사용
b1 = Book1('개발자로 성공하기', '13000')
print(b1)

 

 

 

 

  • 띄어쓰기로 정의
# namedtuple 선언
Book2 = namedtuple('Book', 'title price')

# namedtuple 사용
b2 = Book2('개발자로 성공하기', '13000')
print(b2)

 

결과는 위와 동일합니다.

 

 

 

  • 콤마로 구분하여 정의
# namedtuple 선언
Book3 = namedtuple('Book', 'title, price')

# namedtuple 사용
b3 = Book3('개발자로 성공하기', '13000')
print(b3)

 

결과는 위와 동일합니다.

 

 

 

  • 같은 Key가 중복되거나 예약어를 사용하는 경우, rename = True 사용하여 정의
# namedtuple 선언
Book4 = namedtuple('Book', 'title price title class', rename=True)

# namedtuple 사용
b4 = Book4('개발자로 성공하기', '13000', '개발자로 성공하기 v2', 'Class값 받아보기')
print(b4)

 

rename=True 를 사용하여 정의하는 방식은 앞선 위 방식들과는 조금 다릅니다.

Book4 변수에 할당한 namedtuple에는 인자를 4개를 받게 작성되어 있습니다.

 

그렇기 때문에, 기존처럼 2개의 인자만 넣어준다면 에러가 발생하게 됩니다.

 

namedtuple을 선언할 때, 'title' 의 값이 중복되기 때문에 그리고 예약어인 'class' 를 인자로 받고 있기 때문에 'rename=True' 옵션을 같이 작성해 주어야 합니다.

 

형식대로 값을 넣어서 namedtuple 을 사용하고 결과를 출력 해보면 아래와 같이 출력됩니다.

중복되는 Key(label)와 인자 이름으로 사용할 수 없는 키워드는 파이썬이 임의로 Key 이름을 정해서 출력하게 됩니다.

어차피 순서대로 숫자가 증가하는 Key 이름이겠지만요.

 

 

한 가지 사용방법을 알려드리면, Dictionary 를 unpacking 하여 사용할 수도 있습니다.

b5 = {'title' : '개발자로 성공하기', 'price' : 13000}
print(Book3(**b5))

 


 

2. namedtuple 메서드

 

  • _make
    새로운 인스턴스를 생성합니다.
b6 = ('피곤해도 이겨내요!', '8700')
print(Book1._make(b6))

b7 = ['이것저것 다 해보며 살아보아요', '123400']
print(Book1._make(b7))

 

 

 

  • _asdict
    namedtuple을 dict 형식으로 변경합니다.

    _asdict 메서드는 dict 으로 변경하여 (이때 OrderedDict으로 변경), json.dumps를 사용하여 Json 으로 변경할 때 사용할 수 있습니다. 
b8 = Book3('회사에 갔다와도 힘이 넘쳐요!!', '9494')
dict8 = b8._asdict()
print(dict8)

 

 

 

  • _replace
    지정된 필드를 새 값으로 대체하며 기존과 다른 새로운 인스턴스를 반환합니다. (Immutable 특성)
# namedtuple 을 사용할 때, 필드명과 함께 값을 지정해주어야 합니다.
b9 = Book2(title='끝이 없는 테스트 잘 하는 방법', price='28000')
print(b9._replace(price='27000'))
print(b9) # b9의 값이 바뀐것이 아닌, 새로운 인스턴스가 생성된다.

 

 

 

  • _fields
    필드 이름을 나열합니다.
print(b8._fields)

 

반응형