在Python中使用字典作为键(非嵌套)

42 投票
10 回答
47587 浏览
提问于 2025-04-15 15:14

Python不允许字典作为其他字典的键。有没有什么方法可以让我们使用非嵌套的字典作为键呢?

关于更复杂的不可哈希对象的问题,以及我具体的使用场景,已经在这里讨论过了。我最开始描述的使用场景是不正确的。

10 个回答

7

要把一个叫做someDictionary的字典变成一个键,可以这样做:

key = tuple(sorted(someDictionary .items())

你可以很简单地用 dict( key ) 来反转这个操作。

8

如果我需要把字典用作键,我会把字典转换成一个元组的元组,也就是把它“压平”。

你可能会觉得这个StackOverflow的问题很有用:在Python中实现嵌套字典的最佳方法是什么?

这里有一个可以压平字典的模块示例:http://yawpycrypto.sourceforge.net/html/public/Flatten.Flatten-module.html

我不太明白你具体的使用场景,我觉得你可能在尝试优化一些其实不需要优化的东西。

84

如果你有一个真正不变的字典(虽然我不太明白你为什么不直接用一对对的列表,比如 [('content-type', 'text/plain'), ('host', 'example.com')]),那么你可以把你的 dict 转换成:

  1. 一对对的元组。你在问题中已经做到了这一点。这里用 tuple 而不是 list 是因为结果需要依赖元素的顺序和不变性。

    >>> tuple(sorted(a.items()))
    
  2. 一个冻结集合。从数学的角度来看,这是一种更合适的方法,因为它只需要你不变的 dict 中元素的相等关系,而第一种方法除了相等关系外,还需要顺序关系。

    >>> frozenset(a.items())
    

撰写回答