NamedTuple이란?
NamedTuple(네임드 튜플)은 파이썬 collections 모듈에서 제공하는 클래스입니다. 일반 튜플과 달리 각 요소에 의미 있는 이름을 붙일 수 있어, 딕셔너리처럼 키(key)와 값(value)의 매핑 구조를 가지면서도 인덱스를 통한 접근까지 지원합니다. 즉, 튜플의 불변성과 딕셔너리의 가독성을 동시에 활용할 수 있는 자료형입니다.
NamedTuple을 사용하려면 먼저 파이썬 표준 라이브러리인 collections 모듈을 임포트해야 합니다.
import collections
NamedTuple 값에 접근하는 방법
NamedTuple의 값은 크게 세 가지 방식으로 접근할 수 있습니다.
첫 번째는 인덱스를 사용하는 방법입니다. NamedTuple의 속성값들은 순서가 유지되기 때문에 일반 튜플처럼 인덱스로 접근할 수 있습니다. 두 번째는 필드 이름(키)을 직접 사용하는 방법입니다. 세 번째는 getattr() 함수를 사용하는 방법으로, NamedTuple은 필드 이름을 속성(attribute)으로 변환해 주기 때문에 getattr()을 통해 해당 속성의 데이터를 가져올 수 있습니다.
예제 코드
import collections as col
#create employee NamedTuple
Employee = col.namedtuple('Employee', ['name', 'city', 'salary'])
#Add two employees
e1 = Employee('Asim', 'Delhi', '25000')
e2 = Employee('Bibhas', 'Kolkata', '30000')
#Access the elements using index
print('The name and salary of e1: ' + e1[0] + ' and ' + e1[2])
#Access the elements using attribute name
print('The name and salary of e2: ' + e2.name + ' and ' + e2.salary)
#Access the elements using getattr()
print('The City of e1 and e2: ' + getattr(e1, 'city') + ' and ' + getattr(e2, 'city'))
실행 결과
The name and salary of e1: Asim and 25000 The name and salary of e2: Bibhas and 30000 The City of e1 and e2: Delhi and Kolkata
다른 자료형을 NamedTuple로 변환하기
다른 컬렉션 자료형을 NamedTuple로 변환하는 몇 가지 방법이 있습니다.
_make() 메서드를 사용하면 리스트, 튜플처럼 반복 가능한(iterable) 객체를 NamedTuple 객체로 손쉽게 변환할 수 있습니다. 또한 딕셔너리 타입 객체도 NamedTuple로 변환이 가능한데, 이때는 ** 언패킹 연산자를 활용합니다.
반대로 NamedTuple을 키가 포함된 OrderedDict 형태로 되돌리고 싶다면 _asdict() 메서드를 사용하면 됩니다.
예제 코드
import collections as col
#create employee NamedTuple
Employee = col.namedtuple('Employee', ['name', 'city', 'salary'])
#List of values to Employee
my_list = ['Asim', 'Delhi', '25000']
e1 = Employee._make(my_list)
print(e1)
#Dict to convert Employee
my_dict = {'name':'Bibhas', 'city' : 'Kolkata', 'salary' : '30000'}
e2 = Employee(**my_dict)
print(e2)
#Show the named tuple as dictionary
emp_dict = e1._asdict()
print(emp_dict)
실행 결과
Employee(name='Asim', city='Delhi', salary='25000')
Employee(name='Bibhas', city='Kolkata', salary='30000')
OrderedDict([('name', 'Asim'), ('city', 'Delhi'), ('salary', '25000')])
그 외 유용한 기능: _fields와 _replace
NamedTuple에는 _fields와 _replace() 같은 편리한 기능도 마련되어 있습니다. _fields 속성을 사용하면 해당 NamedTuple이 어떤 필드들로 구성되어 있는지 한눈에 확인할 수 있습니다. _replace() 메서드는 불변(immutable)인 NamedTuple의 특정 필드 값을 새로운 값으로 교체한 새로운 객체를 만들 때 사용합니다.
예제 코드
import collections as col
#create employee NamedTuple
Employee = col.namedtuple('Employee', ['name', 'city', 'salary'])
#Add an employees
e1 = Employee('Asim', 'Delhi', '25000')
print(e1)
print('The fields of Employee: ' + str(e1._fields))
#replace the city of employee e1
e1 = e1._replace(city='Mumbai')
print(e1)
실행 결과
Employee(name='Asim', city='Delhi', salary='25000')
The fields of Employee: ('name', 'city', 'salary')
Employee(name='Asim', city='Mumbai', salary='25000')
마무리
NamedTuple은 코드의 가독성을 높이면서도 튜플의 성능과 불변성을 그대로 유지할 수 있는 강력한 도구입니다. 인덱스·키·getattr()을 통한 다양한 접근 방식과 _make(), _asdict(), _replace() 등의 변환·조작 기능을 잘 활용하면, 단순 데이터 레코드를 다루는 파이썬 코드를 훨씬 깔끔하게 작성할 수 있습니다.