파이썬 라이브러리 collections.namedtuple
#008 파이썬 라이브러리 : collections.namedtuple 자료에 이름을 붙이는
Python의 collections 모듈은 내장 유형의 확장인 특수 컨테이너 데이터 유형 세트를 제공합니다. 이러한 데이터 유형 중 하나는 이름이 지정된 필드가 있는 튜플 객체의 하위 클래스인 namedtuple이라고 하며, 더 읽기 쉽고 자체 문서화 코드를 허용합니다.
namedtuple 함수
namedtuple은 튜플 클래스에서 상속된 새 클래스를 반환하는 팩토리 함수입니다. 클래스는 동적으로 생성되며 사용자가 정의한 고정 속성 세트를 가집니다. 이러한 특성은 일련의 문자열 또는 공백으로 구분된 단일 문자열로 지정된 다음 별도의 필드 이름으로 분할됩니다. 결과 클래스는 튜플처럼 동작하는 인스턴스를 만드는 데 사용할 수 있지만 인덱스뿐만 아니라 이름으로도 필드에 액세스 할 수 있다는 추가 이점이 있습니다.
구 문
namedtuple을 생성하는 구문은 다음과 같습니다
from collections import namedtuple
# create a new class that inherits from tuple and has fields 'field1', 'field2', and 'field3'
MyTuple = namedtuple('MyTuple', ['field1', 'field2', 'field3'])
# create a new instance of the class
my_tuple = MyTuple('value1', 'value2', 'value3')
▶ 설명
namedtuple 함수는 생성할 클래스 이름과 일련의 필드 이름이라는 두 가지 인수를 사용합니다. 첫 번째 인수는 새 클래스의 이름으로 사용되는 문자열이고 두 번째 인수는 새 클래스의 필드 이름을 정의하는 일련의 문자열입니다.
위의 예에서 튜플 클래스에서 상속되고 field1, field2 및 field3의 세 필드가 있는 MyTuple이라는 새 클래스를 만들었습니다. 그런 다음 my_tuple이라는 클래스의 새 인스턴스를 만들고 세 개의 필드에 각각 'value1', 'value2' 및 'value3' 값을 할당했습니다.
필드 액세스하는 방법
namedtuple의 필드는 인덱스 또는 이름의 두 가지 방법으로 액세스 할 수 있습니다. 이름으로 필드에 액세스 할 때 필드 이름은 인스턴스의 속성으로 사용됩니다.
예를 들어
# access a field by index
my_tuple[0] # returns 'value1'
# access a field by name
my_tuple.field1 # returns 'value1'
이름으로 필드에 액세스 할 때 필드 이름은 유효한 Python 식별자여야 하며 밑줄로 시작할 수 없다는 점에 유의해야 합니다.
namedtuple의 이점
- 가독성: namedtuple은 일반 튜플보다 읽기 쉽고 자체 문서화되는 대안을 제공합니다. 필드 이름을 사용하면 튜플에 있는 각 요소의 목적을 더 쉽게 이해할 수 있습니다.
- 불변성: namedtuple 인스턴스는 불변입니다. 즉, 생성된 후에 값을 변경할 수 없습니다. 이렇게 하면 우발적인 데이터 수정을 방지할 수 있습니다.
- 메모리 효율성: namedtuple은 메모리 사용에 최적화된 튜플 클래스를 기반으로 하기 때문에 동일한 속성을 가진 사용자 지정 클래스보다 메모리 효율성이 높습니다.
- 이전 버전과의 호환성: namedtuple 인스턴스는 일반 튜플로 취급될 수 있습니다. 즉, 튜플을 기대하는 코드는 여전히 namedtuple 인스턴스에서 작동할 수 있습니다.
결 론
결론적으로 namedtuple은 경량의 자체 문서화 데이터 구조를 생성하기 위한 Python의 강력한 도구입니다. 일반 튜플보다 더 읽기 쉽고 메모리 효율적인 대안을 제공하며 실수로 데이터를 수정하는 것을 방지할 수 있습니다. 명명된 필드를 제공함으로써 namedtuple은 튜플에 있는 각 요소의 목적을 더 쉽게 이해할 수 있게 하여 더 유지 관리하기 쉽게 만들 수 있습니다.
실제 예제
이름, 나이, 휴대전화로 구성된 튜플 직원정보 데이터를 이용하여 직원 주소록을 만듭니다.
# -*- coding:utf-8 -*-
from collections import namedtuple
# 기존에 있던 직원 튜플 데이터
data = [
('홍길동', 23, '01099990001'),
('김철수', 31, '01099991002'),
('이영희', 29, '01099992003'),
]
# 직원 namedtuple 자료형을 생성한다.
Employee = namedtuple('Employee', 'name, age, cellphone')
# 튜플 데이터를 namedtuple로 변환 : _make() 함수를 사용
data = [Employee._make(emp) for emp in data]
# 이제 key로 접근 가능하다.
# 첫번째 직원
emp = data[0]
print(emp)
print(emp.name)
print(emp.age)
print(emp.cellphone)
# _asdict() 함수를 사용하여 딕셔너리로 변환
print(emp._asdict())
# 인덱스로 접근 가능
print(emp[0])
print(emp[1])
print(emp[2])
# _replace() 함수로 속성값 변경
new_emp = emp._replace(name="박길동", age=24, cellphone = '01099990004')
print(new_emp)
▶ 결과
Employee(name='홍길동', age=23, cellphone='01099990001')
홍길동
23
01099990001
{'name': '홍길동', 'age': 23, 'cellphone': '01099990001'}
홍길동
23
01099990001
Employee(name='박길동', age=24, cellphone='01099990004')
▶ 설명
네임드 튜플은 값을 변경할 수 없는(immutable) 튜플의 특징을 그대로 가지므로 속성값을 변경하려고 하면 오류가 난다. _replace() 함수로만 값을 바꿀 수 있으며, _replace() 함수는 해당 객체를 직접 변경하는 것이 아니라 값을 변경한 새로운 객체를 만들어 반환한다는 점에 주의해야 합니다.
감사합니다.
Do it! SQL을 찾아 주셔서 감사합니다. ♥ 댓글이 큰 힘이 됩니다. |
'IT > 파이썬 라이브러리 (Python)' 카테고리의 다른 글
#010 파이썬 라이브러리 : collections.defaultdict 딕셔너리 생성 및 초기화 한방에 (46) | 2023.04.05 |
---|---|
#009 파이썬 라이브러리 : collections.Counter 사용된 단어 수를 세는 (51) | 2023.04.04 |
#007 파이썬 라이브러리 : collections.deque 자료의 양쪽 끝에서 삽입 삭제 (38) | 2023.04.02 |
#006 파이썬 라이브러리 : calendar.isleap 윤년 계산 (43) | 2023.04.01 |
#005 파이썬 라이브러리 : datetime.timedelta 날짜 간의 차이 및 계산 (54) | 2023.03.31 |
댓글