Подтвердить что ты не робот

Комплексные словарные ключи Python

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

dictionary = {(key1,key2,key3) : object}

key1 может быть любым значением от 1 до 10 key2 может быть любым значением от 11 до 20 key3 может быть любым значением между 21 и 30

Порядок, в котором расположены клавиши, имеет значение.

В частности, мои ключи соответствуют диапазону декартовых координат x, y, z, в которых много объектов плавают вокруг. Я хочу иметь возможность сортировать относительное положение объектов на основе их x, y, z позиции.

Есть ли способ установить это или мне придется использовать другой подход? Спасибо за любую помощь!

4b9b3361

Ответ 1

Уверен, что вы можете создать однострочный ключ для этого - просто соедините строковые результаты для ваших ключей типа ','. join ([k1, k2, k3])

Подробнее о словарях.

словари индексируются ключами, которые могут быть любыми неизменяемыми типами; строки и числа всегда могут быть ключами. Кортежи могут использоваться как ключи, если они содержат только строки, числа или кортежи; если кортеж содержит изменяемый объект прямо или косвенно, он не может использоваться как ключ. Вы не можете использовать списки в качестве ключей, поскольку списки могут быть изменены на месте используя назначения индекса, назначения срезов или методы, такие как append() и extend().

Итак, вы пытаетесь использовать кортежи в качестве ключей, и это нормально.

Обратите внимание, что словари в python не сортируются. Вы можете использовать collection.OrderedDict для этого. Также для правильной сортировки используйте сортировку/сортировку функций с ключом параметра, заданным для сортировки, как вы хотите.

EDITED:

from itertools import product
myDict = {}
for x,y,z in product(range(10), range(10,20), range(20,30)):
    myDict[(x,y,z)] = sum([x,y,z])

Ответ 2

Надеюсь, вы найдете это полезным.

>>> from math import sqrt
>>> def dist(p1, p2):
...     x1, y1, z1 = p1
...     x2, y2, z2 = p2
...     xd = x1 - x2
...     yd = y1 - y2
...     zd = z1 - z2
...     return sqrt((xd ** 2 + yd ** 2 + zd ** 2))
>>> myPoint = (0,0,0)
>>> class MyObject: pass
>>> myDict = {(1,2,3):MyObject(), (4,5,6):MyObject()}
>>> sorted([dist(myPoint, point) for point in myDict])
10: [3.7416573867739413, 8.774964387392123]

Ответ 3

Мне кажется, что вы хотите, возможно, неупорядоченный набор отображений из ключей (упорядоченных троек) в значения (объекты). Если это так, очень легко сделать составной ключ из упорядоченной тройки:

Предположим, что obj0 находится в координатах x, y, z (10,20,30) и obj1 находится в координатах x, y, z (11,21,31). Тогда:

myObjects = {(10,20,30): obj0,
             (11,21,31): obj1
            }

Это работает, потому что оба tuple и int являются неизменяемыми типами

Надеюсь, что поможет