[Python] namedtuple (네임드튜플) 사용 (Struct like C)

namedtuple은 C언어 Struct와 같이 Value를 여러 개 저장해서 Variable 이름으로 접근이 가능하다. 개인적으로 C Struct와 비슷해서 사용하게 되었다. 출처 1에 따르면 namedtuple은 Python 기본자료형이 아니라고 한다. namedtuple을 사용하기 위해서는 아래와 같이 Collections를 추가해야 한다.

  • from collections import namedtuple

namedtuple 사용하기

출처 1에 제공하는 예제를 조금 변경하여서 아래 예제 코드를 하나 작성하였다.

from collections import namedtuple

#MK: Create namedtuple (like C-Struct)
PersonalInfo = namedtuple("pInfo", "name age phoneNum")

#MK: Create two personal information (namedtuple의 name, age, phoneNum등의 Variable 이름을 사용하지 않아도 됨)
mkInfo = PersonalInfo(name="MK", age=35, phoneNum="010-010-0101")
mkInfo2 = PersonalInfo("MK2", 40, "010-111-0101")

#MK: Print namedtuple values
print(mkInfo.name)
print(mkInfo.age)
print(mkInfo.phoneNum)

print(mkInfo2.name)
print(mkInfo2.age)
print(mkInfo2.phoneNum)

그림1: namedtuple Example 결과

위 그림1은 위 예제 코드를 실행한 결과 화면이다.

  • “PersonalInfo = namedtuple(“pInfo”, “name age phoneNum”)”은 C Struct와 같이 PersonalInfo라는 Struct 형태의 namedtuple을 생성한다.
  • PersonalInfo를 사용해서 mkInfo, mkInfo2 값을 생성하였다.
  • mkInfo.name, mkInfo.phoneNum, mkInfo.age 등으로 저장한 값을 읽을 수 있다.

namedtuple + list 사용하기

namedtuple과 list를 사용하여 많은 데이터를 쉽게 관리할 수 있는 것 같다 (출처2). 아래 예제 코드 역시 출처 1 코드를 약간 수정하였다.

from operator import attrgetter
from collections import namedtuple

#MK: 총 3개의 PersonalInfo namedtuple을 생성함
PersonalInfo=namedtuple("pInfo", "name age phoneNum")
mkInfo=PersonalInfo(name="MK", age=35, phoneNum="010-010-0101")
mkInfo2=PersonalInfo("MK2", 40, "010-111-1111")
mkInfo3=PersonalInfo("MK3", 37, "111-000-1111")

#MK: 3개의 namedtuple을 list에 추가함
personalInfoList=[]
personalInfoList.append(mkInfo)
personalInfoList.append(mkInfo2)
personalInfoList.append(mkInfo3)

#MK: 추가된 순서대로 출력됨
print(personalInfoList)

#MK: 나이순으로 정렬된 리스트를 출력함
sortedPersonalInfoList=sorted(personalInfoList, key=attrgetter("age"))
print(sortedPersonalInfoList)

#MK: 나이 역순으로 정렬된 리스트를 출력함
sortedPersonalInfoList=sorted(personalInfoList, key=attrgetter("age"), reverse=True)
print(sortedPersonalInfoList)

#MK: 전화번호를 순서대로 정렬함
sortedPersonalInfoList=sorted(personalInfoList, key=attrgetter("phoneNum"))
print(sortedPersonalInfoList)

그림 2: namedtuple + list Example 결과

위 그림2는 namedtuple + list 예제 코드를 실행한 결과이다.

  • “personalInfoList.append(mkInfo)”은 namedtuple로 생성한 값은 list에 추가한다. 위 예제에서는 총 3개의 PersonalInfo를 추가하였다.
  • “sortedPersonalInfoList=sorted(personalInfoList, key=attrgetter(“age”))”은 age 값을 기준으로 Sorting을 진행한다. attrgetter을 사용하기 위해서 “from operator import attrgetter”를 추가해야 한다.
  • sorted 뒤에 “reverse=True”를 추가하면 역순으로 Sorting을 진행한다 (출처 3).

위와 같이 namedtuple을 list와 같이 사용하면 데이터를 효율적으로 관리할 수 있는 것 같다.

실험환경

  • Python Version: 3.7
  • OS: Ubuntu Linux 18.04

출처

  1. https://thrillfighter.tistory.com/454
  2. https://stackoverflow.com/questions/12087905/pythonic-way-to-sorting-list-of-namedtuples-by-field-name
  3. https://www.programiz.com/python-programming/methods/built-in/sorted

Leave a Comment