【问题标题】:How to cast tuple into namedtuple?如何将元组转换为命名元组?
【发布时间】:2014-09-19 22:20:19
【问题描述】:

我想在内部使用 namedtuples,但我想保持与给我提供普通元组的用户的兼容性。

from collections import namedtuple

tuple_pi = (1, 3.14, "pi")  #Normal tuple 

Record = namedtuple("Record", ["ID", "Value", "Name"])

named_e = Record(2, 2.79, "e")  #Named tuple

named_pi = Record(tuple_pi)  #Error
TypeError: __new__() missing 2 required positional arguments: 'Value' and 'Name'

tuple_pi.__class__ = Record
TypeError: __class__ assignment: only for heap types

【问题讨论】:

    标签: python python-3.x namedtuple


    【解决方案1】:

    您可以使用*args 调用语法:

    named_pi = Record(*tuple_pi)
    

    这会将tuple_pi 序列的每个元素作为单独的参数传入。

    您还可以使用namedtuple._make() class method 将任何序列转换为实例:

    named_pi = Record._make(tuple_pi)
    

    演示:

    >>> from collections import namedtuple
    >>> Record = namedtuple("Record", ["ID", "Value", "Name"])
    >>> tuple_pi = (1, 3.14, "pi")
    >>> Record(*tuple_pi)
    Record(ID=1, Value=3.14, Name='pi')
    >>> Record._make(tuple_pi)
    Record(ID=1, Value=3.14, Name='pi')
    

    【讨论】:

    • 简明扼要。我不明白你怎么这么快就回答了这个问题。
    • 不错。您还可以使用关键字 args 语法来交出 dict:MyNamedTuple(**mydict)。当然,dict 需要包含元组字段作为键。
    • W.r.t.到内存消耗:用namedPi = Record(*tuplePi)namedPi = Record._make(tuplePi)转换后,我可以摆脱tuplePi,对吧?
    • @thinwybk:是的,namedtuple 实例现在引用了相同的值,因此您不再需要tuplePi
    • tuple.__new__(Record, tuple_pi)_make uses 在后台。
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多