본문 바로가기
기술스택을 쌓아보자/Python

[1일 1모듈] collections -1: namedtuple

by 소리331 2020. 9. 3.
반응형

1일 1 모듈이지만 collection은 죄다 쪼개서 볼 것이다.

 

💡  선요약:
파이썬의 빌트인 모듈 중 하나로, 기본 자료형인 dict, list, set, tuple에서 더 나아가 namedtuple, deque, defaultdict 등 특수 자료형을 사용할 수 있도록 하는 모듈이다!

 

*공부하면서 작성한 글- 틀린 게 있다면 언제든지 피드백 SVP~!*

 

 

최근 데이터의 중요성이 부각되고 있는 건 모두가 알고 있는 사실, 이러한 모듈들을 잘 사용하면 속도도 더욱 빠르고, 메모리도 절약하는 경제적인 코딩을 할 수 있다고 한다.  

 

namedtuple: ㅎㅇ 나 튜플. 이름 내놔

 

namedtuple이라는 단어를 뜯어보면, 말 그대로 '이름이 붙여진 튜플'이다. 작고 간단한 클래스를 만드는 것과 유사하다.  

 

💡  튜플의 특성!
- immutable: 한번 생성되면 값을 변경할 수 없다.
- iterable: 자료형 내의 데이터는 순서를 가진다. # (1, 2, 3) 이라는 튜플 내에서 순서가 유의미하다는 뜻

 

이런 튜플에 이름을 주면 어떻게 될까? 튜플 안의 데이터에 접근할 때, 순서로 접근하는 것이 아니라 이름으로 접근할 수 있게 된다. 이름으로 데이터에 접근하게 될 수 있었다는 점에서 클래스라고 표현하는 것으로 이해했다.

 

위치 인덱스 대신 이름으로 필드에 액세스하는 기능을 추가합니다.

 

정의는 요렇게

 

namedtuple(
	typename,  # tuple에 부여할 이름
    field_names,  # tuple안의 데이터들이 가질 이름 보통 리스트 형태로 쓰거나 'x y', 'x, y'와 같은 형태도 가능
    *, 
    rename=False,  # True시 유효하지 않은 필드명은 위치이름으로 대체
    defaults=None,  # field_names에서 지정된 필드들의 default 값, 오른쪽부터 적용된다.
    module=None  # 네임드 튜플의 __module__ 어트리뷰트가 해당 값으로 설정됩니다. 라고 하는데 이해를 잘 못했당... 쭈굴...
    )

 

예시 ㄱㄱ

# 공식 문서에서 긁어왔당
from collections import namedtuple

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

p = Point(11, y=22)

p[0] + p[1] # iterable 특성 O, result = 33
p.x + p.y  # 위치 indexing, result = 33

 

다음은 rename=True 설정시의 예시

>>> from collections import namedtuple
>>> Point = namedtuple('Point', ['x', 'x'], rename=False)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
......
ValueError: Encountered duplicate field name: 'x'
###########################################################

>>> Point = namedtuple('Point', ['x', 'x'], rename=Ture) # 정상생성
>>> a = Point(1, 2)
>>> a
Point(x=1, _1=2)

보다시피 rename=False설정시 중복된 이름이 있을 경우 에러가 발생하지만, True 설정 시 해당 데이터의 위치로 이름이 변경된다. 

 

namedtuple 메서드

# _make()로 namedtuple에 할당
>>> t = [11, 22]
>>> tmp = Point._make(t)
>>> tmp
Point(x=11, y=22)

#_asdict(): 이름만 봐도 딕셔너리로
>>> tmp._asdict()
{'x': 11, 'y': 22}
# 참고로, 3.1~3.7 버전: OrderedDict 반환, 그 외 dict 반환(파이썬 3.7부터 dict도 iterable)

#_replace() 말그대로 대체
>>> tmp._replace(x = 1)
>>> tmp
Point(x=1, y=22)

# _fields 필드값 반환
>>> tmp._fields
('x', 'y')

# _field_defaults 필드명을 기본값으로 매핑
>>> Account = namedtuple('Account', ['type', 'balance'], defaults=[0])
>>> Account._field_defaults
{'balance': 0}
>>> Account('premium')
Account(type='premium', balance=0)

 

 

 아래 부분도 알게 된다면 코딩이 더욱 원활해 질 것 같다!

1.  만일 문자열로 필드를 조회하고 싶다면 getattr( {object},  '{field_name}' 을 통해 조회하면 된다!

2.  dict -> namedtuple 로 반환하고 싶다면 **를 사용하자
>>> d = {'x': 11, 'y': 22}
>>> Point(**d)

3. namedtuple을 사용하면 class 생성시 __init__을 번거롭게 쓰지 않아도 될 것 같다.

참고문헌

(아래 문서는 모두 한글이다. 와! 세종대왕님!)

파이썬 공식 문서: https://python.flowdas.com/library/collections.html

Youtube 채널 TeamLab: https://www.youtube.com/channel/UC_kvhNYJtP1-Ap67byTbfuw

 

시니어가 되는 그날까지!

반응형

댓글