将字典转换为namedtuple或其他类似可散列字典的Pythonic方法?

2024-03-06

我有一本字典,比如:

d = {'a': 1, 'b': 2, 'c': 3, 'd': 4}

我想将其转换为命名元组。 我当前的方法是使用以下代码

namedTupleConstructor = namedtuple('myNamedTuple', ' '.join(sorted(d.keys())))
nt= namedTupleConstructor(**d)

产生

myNamedTuple(a=1, b=2, c=3, d=4)

这对我来说效果很好(我认为),但是我是否缺少一个内置的,例如......

nt = namedtuple.from_dict() ?

更新:正如评论中所讨论的,我想要将字典转换为命名元组的原因是它变得可散列,但通常仍然可以像字典一样使用。

UPDATE2:在我发布这个问题四年后,TLK 发布了新答案 https://stackoverflow.com/a/68947528/1870832推荐使用我认为非常棒的数据类装饰器。我想这就是我今后会使用的。


要创建子类,您可以直接传递字典的键:

from collections import namedtuple

MyTuple = namedtuple('MyTuple', d)

现在从此字典或具有匹配键的任何其他字典创建元组实例:

my_tuple = MyTuple(**d)

Beware:命名元组比较仅值(订购)。它们被设计为常规元组的直接替代品,并具有命名属性访问作为附加功能。进行相等比较时不会考虑字段名称。这可能不是您想要或期望的namedtuple类型!这不同于dict相等比较,它确实考虑了键并且比较顺序不可知。

对于那些并不真正需要类型的读者元组的子类,首先使用命名元组可能没有多大意义。如果您只想在字段上使用属性访问语法,那么创建会更简单、更容易名称空间 https://docs.python.org/3/library/types.html#types.SimpleNamespace对象代替:

>>> from types import SimpleNamespace
>>> SimpleNamespace(**d)
namespace(a=1, b=2, c=3, d=4)

我想要将字典转换为命名元组的原因是它变得可散列,但通常仍然可以像字典一样使用

对于像菜谱这样的可散列“attrdict”,请查看冷冻的box https://github.com/cdgriffith/Box/:

>>> from box import Box
>>> b = Box(d, frozen_box=True)
>>> hash(b)
7686694140185755210
>>> b.a
1
>>> b["a"]
1
>>> b["a"] = 2
BoxError: Box is frozen

Python 的更高版本中可能还会出现冻结的映射类型,请观看此 PEP 草案以了解接受或拒绝:

PEP 603 -- 将 freezemap 类型添加到集合中 https://www.python.org/dev/peps/pep-0603/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将字典转换为namedtuple或其他类似可散列字典的Pythonic方法? 的相关文章

随机推荐