728x90
  • Dictionary와 비슷함
  • 키와 인덱스로 접근 가능
  • 메모리를 효율적으로 다룰 수 있음
  • 정의 방식
    • 1) 리스트로 구분

      Point = namedtuple('Point', ['x', 'y'])

    • 2) 띄어쓰기로 정의

      Point = namedtuple('Point', 'x y')

    • 3) 콤마로 구분

      Point = namedtuple('Point', 'x, y')

    • 4) 같은 key가 중복되거나 예약어를 사용하는 경우, rename=True 사용

      Point = namedtuple('Point', 'x y x class', rename=True)

    • 5) Dictionary를 unpacking

      temp_dict = {'x': 40, 'y': 30} p1 = Point(**temp_dict)

  • 사용 예시
    • 위치 또는 키워드 아규먼트 사용 가능
    • 인덱스로 접근 가능
    • unpack도 사용 가능
    • 필드 이름으로 접근 가능
    • __repr__ 사용 가능

# Basic example
Point=namedtuple('Point', ['x', 'y'])
p=Point(11, y=22) # instantiate with positional or keyword arguments
p[0] + p[1] # indexable like the plain tuple (11, 22)
33
x, y=p # unpack like a regular tuple
x, y
p.x + p.y # fields also accessible by name
p # readable __repr__ with a name=value style

 




네임드 튜플 메소드

  • _make
    • 새로운 인스턴스 생성함
  • _fields
    • 필드 네임 확인
  • _asdict
    • 네임드 튜플을 Dictionary로 바꾸고 싶을 떄 사용
    • Python named tuple to dict
    • OrdededDict 반환함
  • _replace
    • 특정 필드의 값이 변경된 새로운 객체를 생성함




Named Tuple에서 기본 값을 설정하고 싶은 경우

  • Python Named Tuple Default Value
  • 네임드 튜플을 사용할 떄, default value를 설정하고 싶은 경우가 있음
    • 단, Python 3.7 이후부터 사용 가능함이런 경우 defaults 인자에 넣으면 됨

from collections import namedtuple

fields=('value', 'left', 'right')

Node=namedtuple('Node', fileds, defaults=(None,) * len(fields))
Print(Node())

  • 혹은 새로 나온 @dataclass를 사용할 수 있음

from dataclasses import dataclass
from typing import Any

@dataclass
class Node:
val: Any=None
left: 'Node'=None
right: 'Node'=None


print(Node())

 




Named Tuple에서 값을 변경하고 싶은 경우

  • Python Named tuple Change Value
  • Named tuple은 immutable이기 때문에 값을 직접 변경할 수 없음
    • 이럴 경우 _replace 함수를 사용해 새로운 값의 객체를 생성할 수 있음
      • 하지만 본래 의미와 다르게 사용하는거 아니냐?는 사람도 있으며
    • mutable한 자료 구조를 원한다면 recordtype를 사용하는 방법도 있음
    • 또는 dataclass를 사용하는 방법도 존재함
  • 각각의 방식을 이해하고, 차이를 알아두면 좋을듯. 자세한 내용은 Changing values of a list of namedtuples 참고




Namedtuple 값을 Json으로 변경하고 싶은 경우

  • python namedtuple to json
  • 직접 Json으로 바꿔주는 메소드는 없지만, dict으로 바꿀 수는 있음
  • OrderedDict으로 변경한 후, json.dumps를 사용하면 변경할 수 있음

     

from collections import namedtuple
import json

Point=namedtuple("Point", ("x", "y"))
pt=Point(15, 15)
json.dumps(pt._asdict())

728x90