[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) '''
최신 댓글