Используйте dict в качестве составного ключа другого питона python (пара ключ-значение)

Я пытаюсь создать структуру данных для выполнения следующей операции.

Я хочу, чтобы пара ключ-значение выглядела примерно так.

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

Я хочу, чтобы вернуть объект стиля json style, когда цвет красный, форма – круг. Возвращайте другой объект стиля json style, когда цвет синий, форма квадратная и т. Д.

Итак, мой ключ не является обычным ключом. Это своего рода сложный ключ. Пожалуйста, предложите

Это невозможно сделать в 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 для получения дополнительной информации о изменяемых и неизменяемых объектах.

Как говорили другие, вы должны использовать неизменяемый объект, например кортеж или именованный , для вашего ключа:

 >>> 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 не поддерживает то, что вы ищете, и Python, поскольку объекты dict не хешируются. В этом случае я бы пошел на namedtuple , так как вы (надеюсь) знаете, какие составляющие у вас будут иметь ваш ключ:

 from collections import namedtuple MyKey = namedtuple("MyKey", "color shape".split()) my_dict = { MyKey(color="red", shape="circle"): {...} } 

Вы не можете использовать объект dict в качестве ключа в python. Я бы хотел использовать что-то неизменяемое как ключ: вместо самого объекта dict я использую его строковое представление.