当前位置: 首页 > 面试题库 >

将字典转换为namedtuple或其他可哈希的dict-like的Python方法?

黄浩涆
2023-03-14
问题内容

我有一本字典,例如:

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

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

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

产生

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

这对我来说很好用(我认为),但是我是否缺少诸如…的内置组件?

nt = namedtuple.from_dict() ?

更新:正如评论中所讨论的,我想将字典转换为namedtuple的原因是为了使其变得可散列,但仍像字典一样仍然可用。


问题答案:

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

MyTuple = namedtuple('MyTuple', d)

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

my_tuple = MyTuple(**d)

当心: namedtuple 比较 (有序)。它们旨在替代常规元组,并具有命名属性访问作为附加功能。
进行相等比较时,将不考虑字段名称
。它可能不是您想要的,也不是您期望的namedtuple那种!这不同于dict相等性比较,后者不但考虑了键而且还比较了不可知顺序。

对于实际上并不需要类型是 tuple子类的
读者,首先使用namedtuple可能没有多大意义。如果只想在字段上使用属性访问语法,那么创建名称空间对象将变得更加简单:

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

我想将字典转换为namedtuple的原因是,它变得可散列,但仍然像字典一样仍然可用

对于像食谱这样的可散列的“ attrdict”,请检查一个冻结的框:

>>> 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-将冻结地图类型添加到集合中



 类似资料:
  • 问题内容: 我在python中有一个命名的tuple类 我想将Town实例转换成字典。我不希望它与城镇中字段的名称或数量严格相关。 有没有一种方法可以编写它,以便我可以添加更多字段,或者传入完全不同的命名元组并获得字典。 我无法更改其他人代码中的原始类定义。因此,我需要以一个Town实例为例,并将其转换为字典。 问题答案: TL; DR:为此提供了一种方法。 这是用法的演示: 这是一个已记录的na

  • 问题内容: 我如何转换defaultdict 成为普通命令? 问题答案: 您可以简单地致电: 但请记住,defaultdict 是 一个dict: 只是稍有不同的行为,因为当您试图访问一个缺少关键-这通常会提高一个-在被称为改为: 这就是您在字典的数据端出现之前看到的内容。 因此,在不实际制作新对象的情况下恢复更多类似dict的行为的另一个技巧是重置: 但这在大多数情况下都不值得。

  • 我知道一个解决方案可能是将这个dict中的每个键值对转换为dict,这样整个结构就变成了dict的dict,然后我们可以将每一行单独添加到DataFrame中。但我想知道是否有更简单、更直接的方法来做到这一点。 到目前为止,我已经尝试将dict转换为series对象,但这似乎不能保持列之间的关系:

  • 寻找将此C#代码转换为Java的帮助 我有字节数组,但需要帮助编码到BigInteger的转换。希望为Hadoop创建一个UDF; ////////////////////////////// 我的最后一段代码与SQL Server中的哈希字节匹配:

  • 问题内容: 我有unicode ,我希望它以字典格式。 我想要它的格式。 我试过了,但它返回的字符串不是字典。 谁能帮我? 问题答案: 您可以使用内置包: 帮助ast模块中的literal_eval函数: literal_eval(node_or_string) 安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,数字,元组,列表,字

  • 我对将纯java Curve25519函数转换为Python等效函数存在问题,具体问题与将哈希字符串转换为字节等效函数的摘要函数有关,java实现: 数据示例: sP=“这是一个用于测试目的的密码短语示例” 生成此字节输出: 82, -57, 124, 58, -105, 76, 123, 3, 119, -21, 121, 71, -54, 73, -75, 54, 31, -33, -49,