【问题标题】:Convert python mutable namedlist to immutable namedtuple将 python 可变命名列表转换为不可变命名元组
【发布时间】:2016-12-19 00:42:27
【问题描述】:

有没有办法将 python 可变命名列表转换或复制为不可变命名元组?

根据 cmets 进行编辑:

我有一个包含值的命名列表

>>> 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)

问题

现在是否可以根据命名列表 NL 中的值创建一个不可变的命名元组 NT 填充值?

来自 cmets 的回答:

用途:

>>> 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

【问题讨论】:

    标签: python-3.x immutability mutable namedtuple


    【解决方案1】:

    如果你的意思是pip install namedlist安装的包,那么如果你有一个这样定义的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)
    

    【讨论】:

    • l = ['A', 'B', 'C', 'D']
    • 这是一个包含四个元素的列表,而不是 namedlist。将此列表转换为(标准)元组可以像 t = tuple(l) 一样简单地完成,但这不是命名元组。
    • 抱歉我的第一条评论。我不习惯 'comment editor' from namedlist import namedlist nl = namedlist('myList', 'a b c d') from collections import namedtuple nt = namedtuple('myTuple', nl._fields) # 我可以在命名列表是这样的: L = ['A', 'B', 'C', 'D'] D = dict(zip(nl._fields,L)) NL = nl(**D) NL # 这个命名列表 NL也可以这样改:NL.a = 'X' NL #是否可以根据namedlist NL中的值创建一个填充值的namedtuple NT
    • 我还是不懂“评论编辑器”,抱歉
    • 如果我正确理解您在评论中的内容,答案是NT=nt(*NL)
    猜你喜欢
    • 2018-04-16
    • 2016-03-24
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2014-09-19
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多