使用dict作为另一个python dict(键值对)

时间:2015-04-23 10:27:15

标签: python json dictionary

我正在尝试构建数据结构以执行以下操作。

我想要一个看起来像这样的键值对。

{
  {"color": "red", "shape": "circle"}: {data: [{}, {}, {}, {}]}
, {"color": "blue", "shape": "square"}: {data: [{}, {}, {}, {}]}
, {"color": "blue", "shape": "circle"}: {data: [{}, {}, {}, {}]}
, {"color": "red", "shape": "square"}: {data: [{}, {}, {}, {}]}
}

我想要的是当颜色为红色,形状为圆形时返回json样式的dict对象。当颜色为蓝色,形状为正方形等时,返回不同的json样式dict对象。

所以,我的钥匙不是真正的钥匙。它是一种复合键。请建议

3 个答案:

答案 0 :(得分:2)

这不能用Python完成。您将收到TypeError。这样做的原因是字典键必须是一个可散列的对象,dict不是。举个例子,试试这个:

>>> d0 = {'foo': 'bar',}
>>> assert d0 == {'foo': 'bar'}
>>> d1 = {d0: 'baz',}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> hash(d0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>>

dict不可清除的原因是它们是可变对象。这意味着(大致)他们可以改变(虽然它比这更微妙,引用Python文档)。 IIRC,在引擎盖下,Python使用哈希表来实现字典键,因此如果一个对象不可用,它就不能用作键。有关可变和不可变对象的更多信息,请参阅Python文档的Data Model部分。

正如其他人所说,你应该使用一个不可变对象,例如元组或namedtuple作为你的密钥:

>>> from collections import namedtuple
>>> colors = 'red blue'.split(' ')
>>> shapes = 'circle square'.split(' ')
>>> Figure = namedtuple('Figure', ('color', 'shape'))
>>> my_dict = {Figure(color, shape): {'data': [{}, {}, {}, {},]}
...            for color in colors for shape in shapes}
>>> assert my_dict == {Figure(color='blue', shape='circle'): {'data': [{}, {}, {}, {}]}, Figure(color='blue', shape='square'): {'data': [{}, {}, {}, {}]}, Figure(color='red', shape='circle'): {'data': [{}, {}, {}, {}]}, Figure(color='red',shape='square'): {'data': [{}, {}, {}, {}]}}
>>> assert my_dict[('blue', 'circle')] == {'data': [{}, {}, {}, {}]}
>>>

答案 1 :(得分:1)

JSON不支持您要查找的内容,因为dict个对象不可以使用,所以也不支持。在这种情况下,我会选择namedtuple,因为您(希望)会事先知道您的密钥会包含哪些成分:

from collections import namedtuple
MyKey = namedtuple("MyKey", "color shape".split())

my_dict = {
   MyKey(color="red", shape="circle"): {...}
}

答案 2 :(得分:0)

你不能在python中使用dict对象作为键。我要做的是使用 immutable 作为键:而不是dict对象本身我使用它的字符串表示。