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

Cas*_*ash 25 python dictionary data-structures

Python不允许将字典用作其他字典中的键.是否有使用非嵌套字典作为键的解决方法?

更复杂的不可清除对象和我的特定用例的一般问题已经移到这里.我对用例的原始描述不正确.

And*_*ikh 58

如果你有一个真正不可变的字典(虽然我不清楚为什么你不只是使用一对配对列表:例如[('content-type', 'text/plain'), ('host', 'example.com')]),那么你可以将你转换dict为:

  1. 成对的元组.你已经在你的问题中做到了这一点.A tuple是必需的,而不是list因为结果依赖于元素的排序和不变性.

    >>> tuple(sorted(a.items()))
    
    Run Code Online (Sandbox Code Playgroud)
  2. 一套冷冻.从数学的角度来看,这是一种更合适的方法,因为它只需要对不可变元素的等式关系dict,而第一种方法除了相等之外还需要有序关系.

    >>> frozenset(a.items())
    
    Run Code Online (Sandbox Code Playgroud)

  • +1:订购的好点.字典总是可以转换为冻结集,因为键必须是唯一的,确保每个元组都将保留在集合中.优雅. (3认同)
  • 请注意,如果dict包含列表或任何其他可变对象作为值,则冻结集解决方案将不起作用.例如:a = {'key1':'val1','key2':['val2','val3']} (2认同)

Mic*_*lon 8

如果我需要使用字典作为键,我会将字典拼成一个元组元组.

您可能会发现此SO问题很有用:实现嵌套字典的最佳方法是什么?

这里有一个扁平模块的例子,它将扁平化字典:http://yawpycrypto.sourceforge.net/html/public/Flatten.Flatten-module.html

我不完全理解您的用例,我怀疑您正试图过早地优化不需要优化的东西.

  • 使`tuple(sorted(somedictionary.items())` - 键的顺序无法保证,这意味着相同的dicts可能通过以不同的顺序列出项目来产生不同的reprs. (8认同)
  • 排序很重要.要了解为什么必须找到具有相同散列的2个不同键值(可能很难找到字符串,但可以使用用户定义的对象轻松实现),然后通过以不同的顺序插入它们来构造2个相等的字典.你会在`.items()`中获得具有不同顺序的相同词典. (2认同)

S.L*_*ott 6

要将 someDictionary 转换为键,请执行以下操作

key = tuple(sorted(someDictionary .items())
Run Code Online (Sandbox Code Playgroud)

您可以轻松地将其反转 dict( key )