2015-04-23 41 views
3

我想框架數據結構來執行以下操作。使用一個字典作爲另一個python字典(鍵值對)的複合鍵

我想要一個看起來像這樣的鍵值對。

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

我想要的是返回一個json樣式的dict對象,當顏色是紅色的,形狀是圓形的。當顏色是藍色時,返回不同的json樣式字典對象,形狀是正方形等。

因此,我的密鑰並不是真正的常規密鑰。這是一種複合鑰匙。請建議

+0

JSON允許在http://stardict.sourceforge.net/Dictionaries.php下載唯一字符串鍵。 – warvariuc

+0

而且這將工作的唯一方法是如果你創建了自己的繼承內置字典類型並實現自己的__hash__函數的類,但是反過來又會導致我想要的字符串,所以只需迭代字典和如果關鍵對象是字典將其轉換爲字符串對象。然後,您可以在JavaScript中循環遍歷它,並通過將另一個循環加載到解碼器中來將該鍵(字符串)轉換爲字典。兩步轉換或在用戶定義的類字典中實現'__hash__'。 – Torxed

回答

1

JSON不支持你在找什麼,Python也不支持,因爲dict對象不可散列。我會去一個namedtuple在這種情況下,因爲你(希望)知道的前期哪些成分你的鑰匙將有:

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

my_dict = { 
    MyKey(color="red", shape="circle"): {...} 
} 
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 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': [{}, {}, {}, {}]} 
>>> 
相關問題