這不能在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
s爲沒有哈希的是,他們可變對象。這意味着(大體上)他們可以改變(儘管比這更微妙一點,引用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': [{}, {}, {}, {}]}
>>>
JSON允許在http://stardict.sourceforge.net/Dictionaries.php下載唯一字符串鍵。 – warvariuc
而且這將工作的唯一方法是如果你創建了自己的繼承內置字典類型並實現自己的__hash__函數的類,但是反過來又會導致我想要的字符串,所以只需迭代字典和如果關鍵對象是字典將其轉換爲字符串對象。然後,您可以在JavaScript中循環遍歷它,並通過將另一個循環加載到解碼器中來將該鍵(字符串)轉換爲字典。兩步轉換或在用戶定義的類字典中實現'__hash__'。 – Torxed