从列表中创建一个namedtuple

时间:2015-06-03 04:24:44

标签: python namedtuple

考虑列表变量 t

In [55]: t
Out[55]:
['1.423',
 '0.046',
 '98.521',
 '0.010',
 '0.000',
 '0.000',
 '5814251520.0',
 '769945600.0',
 '18775908352.0',
 '2.45024350208e+11',
 '8131.903',
 '168485.073',
 '0.0',
 '0.0',
 '0.022',
 '372.162',
 '1123.041',
 '1448.424']

现在考虑一个 namedtuple 'Point':

Point = namedtuple('Point', 'usr sys idl wai hiq siq  used  buff  cach  free
    read  writ recv  send majpf minpf alloc  vmfree')

我们如何将变量t转换为Point?最明显的(对我来说反正..)方法 - 只提供列表作为构造函数参数 - 不起作用:

In [57]: Point(t)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-57-635019d8b551> in <module>()
----> 1 Point(t)

TypeError: __new__() takes exactly 19 arguments (2 given)

2 个答案:

答案 0 :(得分:1)

使用Point(*t)t的内容展开为Point构造函数的参数。

答案 1 :(得分:1)

更有效的解决方案:使用special _make alternate constructor直接从任意迭代构造namedtuple,而无需创建额外的中间tuple(作为主要构造函数的星形解包需要)。运行速度更快,内存流失更少:

Point._make(t)

尽管有名称,但_make 公共API的一部分;它以前导下划线命名,以避免与字段名称冲突(不允许以下划线开头)。