본문 바로가기
Python/기본문법

namedtuple (파이썬 자료형)

by yororing 2024. 7. 31.

00 개요

  • 목적: 코드분석 중 from collections import namedtuple 하는데 namedtuple의 개념을 이해 및 정리하고자 함
  • namedtuple을 이해하기 위해선 파이썬의 데이터 자료형인 tupledictionary를 먼저 알아야 함

 

01 tuple이란

1. 정의

  • 순서가 있는 데이터 집합 → 인덱스로 접근 가능
  • 한 번 생성된 후 수정 불가
  • 형태: ('a', 'b', 'c', 1, 2, 3, ...)

2. 튜플 생성

1) 괄호 사용 ( )

  • Note: 괄호 안에 콤마 (,) 미사용 시 int로 선언됨
>>> tuple1 = ('abc', 123, 3.14, ['ed', 456], ('g', 'h'))
>>> tuple1
('abc', 123, 3.14, ['ed', 456], ('g', 'h'))
>>> type(tuple1)
<class 'tuple'>

# , 미사용 시 tuple 생성 안 됨
>>> integer = (5)
>>> integer
5
>>> type(integer)
<class 'int'>

2) 콤마 사용 ,

>>> tuple2 = 'abc', 123, 3.14, ['ef', 456], ('g', 'h')
>>> tuple2
('abc', 123, 3.14, ['ef', 456], ('g', 'h'))
>>> type(tuple2)
<class 'tuple'>

>>> tuple3 = 3,
>>> tuple3
(3,)
>>> type(tuple3) 
<class 'tuple'>

 

3) tuple() 함수 사용

>>> list1 = [1, 2, 'abe', (2, 3, 4)]
>>> type(list1) 
<class 'list'>

>>> tuple1 = tuple(list1)
>>> tuple1
(1, 2, 'abe', (2, 3, 4))
>>> type(tuple1)
<class 'tuple'>

 

02 dictionary란

1. 정의

  • 순서가 없는 데이터 집합 → 인덱스로 접근 불가능
  • 수정 가능
  • 키(key, 중복 불가)와 값(value)의 쌍으로 이루어진 자료구조 → 고유한 key로 value에 접근 가능
  • 형태: {'age': 30, 'fruits': ['apple', 'banana'], 'veg': ['cucumber', 'eggplant'], 'id': [1, 2, 3], ...}

2. dictionary 생성

1) 괄호 사용 { }

>>> dict1 = {'name': 'Pearl', 'age': 30, 1: 'one'}
>>> dict1
{'name': 'Pearl', 'age': 30, 1: 'one'}
>>> type(dict1) 
<class 'dict'>

>>> dict2 = {}				# 빈 딕셔너리 생성
>>> dict2
{}
>>> dict2['name'] = 'Pearl'		# 'name'이라는 key에 'Pearl'이라는 value 매핑해주기
>>> dict2
{'name': 'Pearl'}
>>> type(dict2) 
<class 'dict'>

2) dict() 함수 사용

  • Note: key로 int 또는 str 줄 경우 에러남
>>> dict3 = dict(name='Pearl', age=30,)		# key에 '' 안붙임   
>>> dict3
{'name': 'Pearl', 'age': 30}
>>> type(dict3)
<class 'dict'>

# key값으로 int를 줬을 경우 에러
>>> dict3 = dict(name='Pearl', age=30, 1='one')
  File "<stdin>", line 1
    dict3 = dict(name='Pearl', age=30, 1='one')
                                       ^^
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?

# key값에 '' 붙였을 경우 에러
>>> dict3 = dict(name='Pearl', age=30, '1'='one')    
  File "<stdin>", line 1
    dict3 = dict(name='Pearl', age=30, '1'='one')
                                       ^^^^
SyntaxError: expression cannot contain assignment, perhaps you meant "=="?

3) zip() 및 dict() 함수 사용

>>> keys = ['name', 'age', 1]
>>> values = ['Pearl', 30, 'one']

>>> zipped = zip(keys, values)
>>> zipped
<zip object at 0x000001C060EEF3C0>
>>> type(zipped) 
<class 'zip'>

>>> dict5 = dict(zipped)
>>> dict5
{'name': 'Pearl', 'age': 30, 1: 'one'}
>>> type(dict5) 
<class 'dict'>

 

03 namedtuple이란

1. 정의

  • 튜플(tuple)과 딕셔너리(dictionary)의 기능을 합쳐 놓은 자료형
  • '이름이 지어진 튜플'로서, 딕셔너리와 같이 인덱스가 아닌 '이름'으로 데이터 조회가 가능하며 생성된 필드 (딕셔너리의 key와 비슷)에 할당되는 데이터를 지닌 클래스 객체 생성 가능
  •  즉, namedtuple은 딕셔너리와 마찬가지로 key-value 쌍으로 데이터를 저장하지만, 키 대신 필드 이름을 사용
  • 또한, 튜플처럼 한 번 생성된 후에는 수정이 불가능
  • 그러므로 namedtuple은 데이터 집합의 구조가 변하지 않는 경우에 유용하게 사용
  • 형태:
    • 변수 = namedtuple( '클래스명' , ['필드명1', '필드명2', '필드명3', ...] )
    • 변수 = namedtuple( '클래스명' , ('필드명1', '필드명2', '필드명3', ...) )

2. namedtuple 생성

  • namedtuple 함수는 첫 번째 인자로 클래스 이름을, 두 번째 인자로는 필드 이름의 리스트나 튜플을 전달
>>> from collections import namedtuple

# 'Person'이라는 이름을 가진 namedtuple 클래스를 생성하여 Person_Class에 저장
>>> Person_Class = namedtuple('Person', ['name', 'age', 'gender'])
>>> Person_Class
<class '__main__.Person'>

# Person 클래스의 객체 (namedtuple) 생성
>>> person1 = Person_Class('Amy', 15, 'Female')
>>> person2 = Person_Class('Mike', 21, 'Male')

# namedtuple 값 확인
>>> person1
Person(name='Amy', age=15, gender='Female')
>>> person2
Person(name='Mike', age=21, gender='Male')

# namedtuple 객체 타입 확인
>>> print(type(person1), type(person2))
<class '__main__.Person'> <class '__main__.Person'>

# namedtuple 객체의 필드 이름으로 접근
>>> print(person1.name, person2.name, person1.age, person2.age, person1.gender, person2.gender) 
Amy Mike 15 21 Female Male

# namedtuple 객체의 인덱스로 접근
>>> print(person1[0], person1[1], person1[2])
Amy 15 Female
>>> print(person1[3]) 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
  • 설명:
    • 'Person'이라는 클래스 이름과 'name', 'age', 'gender'라는 필드 이름을 가진 namedtuple을 생성하여 Person_Class에 저장
    • person1과 person2는 이제 Person 클래스의 객체
    • 객체를 생성할 때 필드 이름에 해당하는 값을 인자로 전달해야 함
    • namedtuple 객체의 필드는 필드 이름 및 인덱스로  접근 가능

3. namedtuple 사용 주의사항

  • 필드 이름으로 유효하지 않은 식별자를 사용하지 않도록 주의
    • 필드 이름은 식별자(변수, 함수 이름 등)로 사용됨 → 유효한 식별자만 사용해야 함
  • 필드 이름은 유일해야 함
    • namedtuple 객체의 필드 이름은 딕셔너리의 키와 같이 유일해야 함
    • 중복된 필드 이름이 있다면 AttributeError 발생
  • 필드 이름에 띄어쓰기나 특수문자 등을 사용하지 않도록 주의해야 함
    • 필드 이름은 소문자와 언더스코어(_)로 구성된 문자열을 사용하는 것이 좋음 
  • namedtuple은 한 번 생성된 후에는 수정 불가능
    • 따라서 객체를 생성 시 반드시 모든 필드에 값 지정 필수
  • namedtuple 객체는 튜플처럼 인덱싱을 지원
    • 따라서 namedtuple 객체의 필드 순서를 바꾸면 예기치 않은 결과가 발생 가능
    • 필드 순서를 변경하려면 새로운 namedtuple 객체를 생성해야 함
  • namedtuple 객체는 일반적인 튜플보다 약간 더 많은 메모리를 사용
    • 필요에 따라 namedtuple 대신 일반 튜플을 사용하는 것이 더 효율적일 수 있음 

참조

  1. (tuple이란) https://rfriend.tistory.com/331 
  2. (dictionary란) https://ctkim.tistory.com/entry/Python-%EC%9E%85%EB%AC%B8-%EA%B0%95%EC%A2%8C-11-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EB%94%95%EC%85%94%EB%84%88%EB%A6%AC
  3. (namedtuple이란) https://python101.tistory.com/entry/%ED%8C%8C%EC%9D%B4%EC%8D%AC-namedtuple-%EC%9D%B4%EB%9E%80#google_vignette
  4.