EXCELSIOR

collections 모듈 - namedtuple 본문

Python/자료구조

collections 모듈 - namedtuple

Excelsior-JH 2017. 8. 22. 22:28

collections.namedtuple()

1. namedtuple이란

명칭 그대로 index(idx)로만 값(value)에 접근 가능한 기본 투플(basic Tuple)과는 다르게 키(key)값으로 접근가능하도록 제공한다. 키(namedtuple에서는 field_names)를 가지고 값에 접근이 가능하다는 부분이 딕셔너리(dict)타입과 비슷하다고 할 수 있다. namedtuple()에 대한 자세한 내용은 docs.python.org에서 확인할 수 있다.

namedtupled()은 collections.namedtuple(typename, field_names, verbose=False, rename=False)을 입력값으로 받으며, field_names 를 통해 namedtuple()의 키 즉, 필드명(fieldname)을 정의할 수 있다. 필드명을 정의할 때에는 필드사이에 빈칸(whitespace)이나 ,로 구분해준다. 예를들어 필드명 xy 를 지정할 경우 'x y''x, y'와 같이 입력해야한다. 다른방법으로는 ['x', 'y']와 같이 리스트(list)형식으로 필드명을 지정해줄 수 있다. 아래의 [예제1]은 namedtuple()의 기본 예시와 basic tuple과의 차이를 나타낸 예시이다. [예제1]에서 볼 수 있듯이 기본 투플은 투플안의 값이 어떠한 속성을 가지는지 알 수 없지만 *namedtuple()*은 field_names를 이용해 값을 지정할 수 있다. 또한 namedtuple()field_name 으로 투플 안의 값에 접근 가능하다. namedtuple()은 csv나 DB에서 테이블을 가져올때 유용하게 사용할 수 있다. 예를들어 EmployeeRecord테이블을 가져온다고 할때, EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') 과 같이 정의하여 사용할 수 있다. 자세한 예시는 docs.python.org에서 확인할 수 있다.

# 1. tuple() vs namedtuple()
# tuple()
a = ('John', 28, '')
b = ('Sally', 24, '')
for n in [a, b]:
print('%s() %d %s .' %n)
'''
John() 28 .
Sally() 24 .
'''
import collections
# namedtuple()
Person = collections.namedtuple("Person", 'name age gender')
P1 = Person(name='Jhon', age=28, gender='')
P2 = Person(name='Sally', age=28, gender='')
for n in [P1, P2]:
print('%s() %d %s .' %n)
'''
Jhon() 28 .
Sally() 28 .
'''
print(P1.name, P1.age, P1.gender)
print(P2.name, P2.age, P2.gender)
'''
Jhon 28
Sally 28
'''

2. collections.namedtuple()의 메소드들

1) _make(iterable)

collections.namedtuple()_make()함수는 기존에 생성된 namedtuple()에 새로운 인스턴스(객체)를 생성하는 메소드이다.

# 2. collections.namedtuple()._make()
import collections
# Person
Person = collections.namedtuple("Person", 'name age gender')
P1 = Person(name='Jhon', age=28, gender='')
P2 = Person(name='Sally', age=28, gender='')
# _make()
P3 = Person._make(['Tom', 24, ''])
for n in [P1, P2, P3]:
print('%s() %d %s .' %n)
'''
Jhon() 28 .
Sally() 28 .
Tom() 24 .
'''

2) _asdict()

기존에 생성된 namedtuple()의 인스턴스(객체)를 OrderedDict로 변환해 주는 함수이다.

# 3. collections.namedtuple()._asdict()
import collections
# Person
Person = collections.namedtuple("Person", 'name age gender')
P1 = Person(name='Jhon', age=28, gender='')
P2 = Person(name='Sally', age=28, gender='')
# _make()
P3 = Person._make(['Tom', 24, ''])
# _asdict() OrderedDict
print(P3._asdict())
'''
OrderedDict([('name', 'Tom'), ('age', 24), ('gender', '')])
'''

3) _replace(kwargs)

기존에 생성된 namedtuple()의 인스턴스(객체)의 값을 변경할때 사용하는 함수이다.

# 4. collections.namedtuple()._replace()
import collections
# Person
Person = collections.namedtuple("Person", 'name age gender')
P1 = Person(name='Jhon', age=28, gender='')
P2 = Person(name='Sally', age=28, gender='')
P3 = Person._make(['Tom', 24, ''])
for n in [P1, P2, P3]:
print('%s() %d %s .' %n)
# _replace()
P1 = P1._replace(name='Neo')
P2 = P2._replace(age=27)
P3 = P3._replace(age=26)
print('-'*20)
for n in [P1, P2, P3]:
print('%s() %d %s .' %n)
'''
Jhon() 28 .
Sally() 28 .
Tom() 24 .
--------------------
Neo() 28 .
Sally() 27 .
Tom() 26 .
'''

4) _fields

생성된 namedtuple()의 필드명(field_names)를 tuple()형식으로 return해준다.

# 5. collections.namedtuple()._fields
import collections
# Person
Person = collections.namedtuple("Person", 'name age gender')
P1 = Person(name='Jhon', age=28, gender='')
P2 = Person(name='Sally', age=28, gender='')
P3 = Person._make(['Tom', 24, ''])
# _fields
print(P1._fields)
'''
('name', 'age', 'gender')
'''

5) getattr()

getattr()는 collections.namedtuple()의 메소드는 아니지만, field_names로 namedtuple()의 인스턴스(객체)의 값을 추출해준다.

# 6. getattr()
import collections
# Person
Person = collections.namedtuple("Person", 'name age gender')
P1 = Person(name='Jhon', age=28, gender='')
P2 = Person(name='Sally', age=28, gender='')
P3 = Person._make(['Tom', 24, ''])
print(getattr(P1, 'name'))
print(getattr(P2, 'gender'))
print(getattr(P3, 'age'))
'''
Jhon
24
'''

6) dictionary 에서 namedtuple()로 변환(**dict)

double-star-operator(**)는 딕셔너리(dict)를 namedtuple()로 변환해준다.

# 7. double-star-operator (dict -> namedtuple)
import collections
# Person
Person = collections.namedtuple("Person", 'name age gender')
P1 = Person(name='Jhon', age=28, gender='')
P2 = Person(name='Sally', age=28, gender='')
# double-star-operator
dic = {'name' : 'Tom', 'age' : 24, 'gender' : ''}
P3 = Person(**dic)
for n in [P1, P2, P3]:
# print('%s() %d %s .' %n)
print(n)
'''
Person(name='Jhon', age=28, gender='')
Person(name='Sally', age=28, gender='')
Person(name='Tom', age=24, gender='')
'''


'Python > 자료구조' 카테고리의 다른 글

내장함수 zip() 과 itertools.zip_longest() 함수  (0) 2017.09.21
collections 모듈 - OrderedDict  (0) 2017.09.07
collections 모듈 - deque  (3) 2017.08.20
collections 모듈 - defaultdict  (0) 2017.08.18
collections 모듈 - Counter  (7) 2017.08.17
Comments