[Python]Named Tuple

Named Tuple에 대해서 알아보자

# 기본튜플과 named tuple에 대해 알아보자.
from collections import namedtuple
from math import sqrt

## 2개의 점 사이의 거리를 구하는 공식
## 점1 : x1, y1
## 점2 : x2, y2
## 공식 = sqrt( (x1 - x2) ^2 + (y1 - y2) ^2 )

# 일반적인 튜플을 이용한 계산
pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)
length1 = sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2)
print(f'pt1 -> pt2 사이의 거리 = {length1}')
print()
''' 출력
pt1 -> pt2 사이의 거리 = 3.8078865529319543
'''

# Named Tuple을 이용한 계산
Point = namedtuple('Point', 'x y')
pt3 = Point(1.0, 5.0)
pt4 = Point(2.5, 1.5)

print(pt3)
print(pt4)
print()
length2 = sqrt((pt3.x - pt4.x) ** 2 + (pt3.y - pt4.y) ** 2)
print(f'pt3 -> pt4 사이의 거리 = {length2}')
print()
'''출력
Point(x=1.0, y=5.0)
Point(x=2.5, y=1.5)

pt3 -> pt4 사이의 거리 = 3.8078865529319543
'''

## Named Tuple 선언방법
Point1 = namedtuple('Point', ['x', 'y'])
Point2 = namedtuple('Point', 'x, y')
Point3 = namedtuple('Point', 'x y')
'''
key는 중복되거나, 예약어를 쓸수 없다. 단 rename=True를 이용하여 강제로 사용이 가능하다.
중복된 키나 예약어는 임의 key로 생성된다.
'''
Point4 = namedtuple('Point', 'x y x class', rename=True)

# 객체생성
temp_dict = {'x': 10, 'y': 23}

p1 = Point1(x=20, y=40)
p2 = Point2(32, 53)
p3 = Point3(56, y=26)
# p3 = Point3(20, x=40) # <- 에러발생 (Point.__new__() got multiple values for argument 'x')
p4 = Point4(56, 23, 55, 67)
p5 = Point1(**temp_dict)  # temp_dict와 namedtuple의 key값이 일치해야 오류가 발생하지 않는다.

# 출력
print(p1)
print(p2)
print(p3)
print(p4)
print(p5)
''' 출력
Point(x=20, y=40)
Point(x=32, y=53)
Point(x=56, y=26)
Point(x=56, y=23, _2=55, _3=67)
Point(x=10, y=23)
'''

# 사용
print(p1.x + p2.y)
''' 출력
73
'''
# unpacking
(x, y) = p1
print(f'x = {x}, y = {y}')
'''출력
x = 20, y = 40
'''
## Named Tuple의 메서드
temp_list = [55, 66]

# _make : list를 이용하여 nametuple 을 생성해준다.
p6 = Point1._make(temp_list)
print(p6)
''' 출력
Point(x=55, y=66)
'''

# _fields : key 값을 반환한다.
print(p1._fields)
'''출력
('x', 'y')
'''

# __asdict : tuple -> OrderedDict 로 변환해 준다.
ordered_dict = p1._asdict()
print(ordered_dict)
print(type(ordered_dict))
print()
'''출력
{'x': 20, 'y': 40}
<class 'dict'>
'''

### Named Tuple 사용예제
## 4개의 반(A,B,C,D)에 학생이 20명이 있는 튜플을 생성하는 예제

# namedtuple 선언
Student = namedtuple('Student', 'ban, number')

# 방법1
bans = "A B C D".split()
numbers = range(1, 21)
students1 = [Student(ban, number)
                for ban in bans
                    for number in numbers]

# 방법2(추천)
students2 = [Student(ban, number)
                for ban in 'A B C D'.split()
                    for number in range(1, 21)]

# 방법3
students3 = []
for ban in 'A B C D'.split():
    for number in range(1, 21):
        students3.append(Student(ban, number))

## 출력
for student in students3:
    print(student)
''' 출력
Student(ban='A', number=1)
Student(ban='A', number=2)
Student(ban='A', number=3)
Student(ban='A', number=4)
Student(ban='A', number=5)
Student(ban='A', number=6)
Student(ban='A', number=7)
Student(ban='A', number=8)
Student(ban='A', number=9)
Student(ban='A', number=10)
Student(ban='A', number=11)
Student(ban='A', number=12)
Student(ban='A', number=13)
Student(ban='A', number=14)
Student(ban='A', number=15)
Student(ban='A', number=16)
Student(ban='A', number=17)
Student(ban='A', number=18)
Student(ban='A', number=19)
Student(ban='A', number=20)
Student(ban='B', number=1)
Student(ban='B', number=2)
Student(ban='B', number=3)
Student(ban='B', number=4)
Student(ban='B', number=5)
Student(ban='B', number=6)
Student(ban='B', number=7)
Student(ban='B', number=8)
Student(ban='B', number=9)
Student(ban='B', number=10)
Student(ban='B', number=11)
Student(ban='B', number=12)
Student(ban='B', number=13)
Student(ban='B', number=14)
Student(ban='B', number=15)
Student(ban='B', number=16)
Student(ban='B', number=17)
Student(ban='B', number=18)
Student(ban='B', number=19)
Student(ban='B', number=20)
Student(ban='C', number=1)
Student(ban='C', number=2)
Student(ban='C', number=3)
Student(ban='C', number=4)
Student(ban='C', number=5)
Student(ban='C', number=6)
Student(ban='C', number=7)
Student(ban='C', number=8)
Student(ban='C', number=9)
Student(ban='C', number=10)
Student(ban='C', number=11)
Student(ban='C', number=12)
Student(ban='C', number=13)
Student(ban='C', number=14)
Student(ban='C', number=15)
Student(ban='C', number=16)
Student(ban='C', number=17)
Student(ban='C', number=18)
Student(ban='C', number=19)
Student(ban='C', number=20)
Student(ban='D', number=1)
Student(ban='D', number=2)
Student(ban='D', number=3)
Student(ban='D', number=4)
Student(ban='D', number=5)
Student(ban='D', number=6)
Student(ban='D', number=7)
Student(ban='D', number=8)
Student(ban='D', number=9)
Student(ban='D', number=10)
Student(ban='D', number=11)
Student(ban='D', number=12)
Student(ban='D', number=13)
Student(ban='D', number=14)
Student(ban='D', number=15)
Student(ban='D', number=16)
Student(ban='D', number=17)
Student(ban='D', number=18)
Student(ban='D', number=19)
Student(ban='D', number=20)
'''

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다