将python mutable namedlist转换为不可变的namedtuple

时间:2016-12-19 00:42:27

标签: python-3.x immutability mutable namedtuple

有没有办法将python可变命名列表转换或复制到不可变的namedtuple?

根据评论编辑:

我有一个名为

的名单
>>> from namedlist import namedlist
>>> nl = namedlist('myList', 'a b c d')

>>> L = ['A', 'B', 'C', 'D']
>>> D = dict(zip(nl._fields,L))
>>> NL = nl(**D)

>>> NL
myList(a='A', b='B', c='C', d='D')

这个可变的命名列表NL可以像这样改变:

>>> NL.a = 'X'

>>> NL
myList(a='X', b='B', c='C', d='D')

然后我还创建了一个具有相同字段的名称元组

from collections import namedtuple
nt = namedtuple('myTuple', nl._fields)

问题

现在是否可以根据namedlist NL中的值创建一个带有填充值的不可变的namedtuple NT?

评论中的答案:

使用:

>>> NT = nt(*NL)

>>> NT
myTuple(a='X', b='B', c='C', d='D')

无法更改此不可变的命名元组:

>>> NT.a = 'Y'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

1 个答案:

答案 0 :(得分:0)

如果您指的是pip install namedlist安装的软件包,那么如果您的命名列表定义如下:

from namedlist import namedlist
nl = namedlist('myList', 'a b c d')

你可以创建一个相应的namedtuple:

from collections import namedtuple
nt = namedtuple('myTuple', 'a b c d')
# or, you if you want to copy the names
nt = namedtuple('myTuple', nl._fields)

使用示例可能如下所示:

l = nl(1,2,3,4)      # myList(a=1, b=2, c=3, d=4)
t = nt(*l)           # myTuple(a=1, b=2, c=3, d=4)