π[python] αα ’αα ΅α¨αα ¦αα ©αα ³ 2 (namedtuple)
on
λ€μ΄κ°λ©°
Pythonμ λ€μλ νν (Named Tuple)μ ML/DLλ±μμ νμ΅μ μν λ°μ΄ν°μ μ μ²λ¦¬ μμ λ°μ΄ν° νμ μ λν μμ μ μ§ννκ±°λ, μΉ κ°λ°μμ DBμμ μλ£λ₯Ό κ°μ Έμ¬ λ λ§μ΄ μ¬μ©νλ κ°λ μ€μ νλ μ λλ€. ννμ νλ² μ λ ₯νλ©΄ μμ μ΄ μλλ€λ νΉμ§μ κΈ°μ΅νκ³ λ³Έ ν¬μ€ν μ μ½μ΄ μ£Όμλ©΄ κ°μ¬νκ² μ΅λλ€.
μ§λ ν¬μ€ν
μμ κ°μ²΄
λ νμ΄μ¬μ λ°μ΄ν°λ₯Ό μΆμν νκ²μ΄λΌκ³ μ€λͺ
νμμ΅λλ€. μ΄λ₯Ό νμ©νμ¬ λͺ¨λ κ°μ²΄λ id
ν΅ν΄ νμΈ ν μ μκ³ valueλ type
μΌλ‘ κ°μ²΄ κ°μ νμΈ ν μ μμ΅λλ€.
κΈ°μ‘΄ λ°©λ²λ‘
μΌλ°μ μΈ νν
λ€μκ³Ό κ°μ΄ λ μ μ μ’νλ₯Ό νν ννλ‘ μ μ₯ ν μ μμ΅λλ€. λ€μ μ½λμ λ¬Έμ μ μ λ°μ΄ν° κ΄μ μμ λ΄€μ λ, 1.0
μ΄ λ»νλκ² λ¬΄μμΈμ§, μΈμμ λν μ 보λ₯Ό νμΈ ν μ μμ΅λλ€.
pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)
λ μ μ¬μ΄μ 거리 ꡬνκΈ°
λ€μκ³Ό κ°μ΄ λ μ μ¬μ΄μ 거리λ₯Ό ꡬν μ μμ΅λλ€.
from math import sqrt
l_leng1 = (pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) ** 2
l_leng1 = sqrt(l_leng1)
# 3.8078865529319543
λ€μλ νν (Namedtuple)
λ€μλ νν μ¬μ©ν΄λ³΄κΈ°
Named tuples are basically easy-to-create, lightweight object types. Named tuple instances can be referenced using object-like variable dereferencing or the standard tuple syntax.
μΆμ²: stackoverflow
λ€μλ ννμ ννμ λ¬Έλ²μ λ°λλ κ°μ²΄ λΌκ³ ν©λλ€. μ΄λ₯Ό μ¬μ©νκΈ° μν΄μλ collectionμ λͺ¨λμ μ¬μ©ν΄μΌ ν©λλ€. μ°λ¦¬λ λ€μλ ννμ μ’νλ‘ μκ° ν κ²μ΄κΈ°λλ¬Έμ namedtuple('Point')
κ³Ό κ°μ΄ βpointβλ₯Ό λͺ
μμ μΌλ‘ μμ±ν΄ μ€λλ€.
from collections import namedtuple
# λ€μλ νν μ μΈ
Point = namedtuple('Point', 'x y')
pt3 = Point(1.0, 5.0)
pt4 = Point(2.5, 1.5)
print(pt3)
print(pt4)
# Point(x=1.0, y=5.0)
# Point(x=2.5, y=1.5)
print(pt3.x, pt3[0])
# 1.0
μ μ½λμ κ°μ΄ pt3
μ λν xμ’ν μ κ·Όμ pt3.x
λ‘ κ°λ₯ν©λλ€. μ¦, μ μ°νκ² μ§κ΄μ μΌλ‘ λ°μ΄ν° κ΄μ μμ ν΄λΉ κ°μ²΄μ λν κ°μ νμΈ ν μ μλ κ²μ΄μ§μ.
μ΄μ ν¬μ€ν μμ μΈλ±μ€λ‘ κ°μ μ κ·Όνλ κ²μ μννλ€κ³ νμ΅λλ€. λλ¬Έμ λ μ μ¬μ΄μ 거리λ₯Ό ꡬνλ κ³μ°λ λ€μκ³Ό κ°μ΄ μμ ν μ μμ΅λλ€. λ€μκ³Ό κ°μ΄ μ½λκ° λ³΄λ€ μ§κ΄μ μΌλ‘ μ΄ν΄κ° μ½κ² λ°λμμ΅λλ€.
l_leng2 = (pt3.x - pt4.x) ** 2 + (pt3.y - pt4.y) ** 2
l_leng2 = sqrt(l_leng2)
λ€μλ νν μ μΈ λ°©λ²
λ€μκ³Ό κ°μ΄ μ¬λ¬ κ°μ§ λ°©λ²μΌλ‘ λ€μλ νν μ μΈμ΄ κ°λ₯ν©λλ€. λ¨, ννμ keyμ μ μΌμ±μ 보μ₯ν΄μΌνκΈ° λλ¬Έμ μ€λ³΅μ νμ©νμ§ μμ΅λλ€. μ΄λλ rename
μΈμλ₯Ό True
λ‘ μ€μ ν΄μΌ ν©λλ€.
Point1 = namedtuple('Point', ['x', 'y'])
Point2 = namedtuple('Point', 'x,y')
Point3 = namedtuple('Point', 'x y')
Point4 = namedtuple('Point', 'x y x class') # error: be unique!
Point4 = namedtuple('Point', 'x y x class', rename=True)
# <class '__main__.Point'>
μ΄λ κ² λ€μν νλΈ κ°μ²΄λ€μ μμ±νκ³ λ€μκ³Ό κ°μ΄ μΈμ€ν΄μ€λ₯Ό μ
λ ₯ν΄ μ€λλ€. p4
μ κ°μ μ΄ν΄ 보면 Point(x=10, y=20, _2=30, _3=40)
μ κ°μ΄ μΆλ ₯λ©λλ€. μ¦, μ€λ³΅λλ Keyκ°μ μλμΌλ‘ Keyμ΄λ¦μ λ³κ²½ν΄μ λ³μλ₯Ό μμ± ν΄ μ£Όμμ΅λλ€.
# κ°μ²΄ μμ±
p1 = Point1(x=10, y=35)
p2 = Point2(20, 40)
p3 = Point3(45, y=20)
p4 = Point4(10, 20, 30, 40)
print(p4)
# Point(x=10, y=20, _2=30, _3=40)
Dict
to unpacking
μ΄λ²μλ dict
νμ
μ κ°μ²΄λ₯Ό λ°μμ λ€μλ ννλ‘ λ§λ€μ΄ λ³΄κ² μ΅λλ€. dict
κ³Ό ννμ μ΄λ©΄ν λ€λ₯Έ λ°μ΄ν° νμ
μ
λλ€. λλ¬Έμ unpacking κΈ°λ₯μ μ¬μ©ν΄μ λ€μλ ννμ μ
λ ₯ν΄ μ€λλ€.
temp_dict = {'x': 75, 'y': 55}
p5 = Point3(**temp_dict)
# Point(x=75, y=55)
λ€μλ νν λ©μλ
_make
: list to namedtuple
리νΈμ€λ₯Ό λ€μλ ννμ μλ£νμΌλ‘ λ³ν ν΄μ£Όλ λ©μλλ λ°λ‘ _make
μ
λλ€.
temp = [52, 38]
p4 = Point._make(temp)
_fields
: νλ λ€μ νμΈ
print(p1._fields)
# ('x', 'y')
_asdict()
: OrderedDict λ°ν
μ λ ¬λ λμ λλ¦¬λ‘ λ°ν ν©λλ€.
print(p1._asdict())