2012-11-23 23 views
18

La mia domanda riguarda le chiavi del dizionario. Voglio impostare un dizionario che abbia 3 chiavi per ogni singolo oggetto. Le chiavi devono essere in ordine e possono avere una vasta gamma di valori. Ad esempio,Chiavi del dizionario complesso Python

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

key1 può essere qualsiasi valore tra 1 e 10 key2 può essere qualsiasi valore tra 11 e 20 key3 può essere qualsiasi valore tra 21 e 30

L'ordine in cui le chiavi sono posto conta.

In particolare, le mie chiavi corrispondono a un intervallo di coordinate cartesiane x, y, z in cui molti oggetti stanno fluttuando all'interno. Voglio essere in grado di ordinare la posizione relativa degli oggetti in base alla loro x, y, posizioni z.

C'è un modo per impostare questo o dovrò adottare un approccio diverso? Grazie per l'aiuto!

+0

Dovrebbe essere possibile, penso. Perché non ci provi? – nhahtdh

+0

Sembra che il tuo esempio sia quello che dovresti provare. Basta fare la tupla della chiave – jdi

+2

Fai attenzione che un dizionario sia effettivamente quello che vuoi, dal momento che implica che non ci siano due oggetti che possono avere esattamente la stessa posizione xyz (dato che ogni chiave contiene solo un valore). Se si dispone di un elenco di oggetti con campi x, yez, è possibile ordinarlo come 'sortedByZ = ordinato (oggetti, chiave = lambda obj: obj.z)'. –

risposta

11

Certo che puoi, così come di creare un'unica chiave stringa per questo -. Basta unire i risultati di stringa per le chiavi come '' join ([k1, k2, k3])

Read more about dictionaries.

I dizionari

sono indicizzati da chiavi, che possono essere di qualsiasi tipo immutabile; stringhe e numeri possono sempre essere chiavi. Le tuple possono essere utilizzate come chiavi se contengono solo stringhe, numeri o tuple; se una tupla contiene oggetti mutabili direttamente o indirettamente, non può essere utilizzata come chiave . Non è possibile utilizzare gli elenchi come chiavi, poiché gli elenchi possono essere modificati in posizione utilizzando assegnazioni di indici, assegnazioni di sezioni o metodi come append() ed estensioni().

Quindi si sta tentando di utilizzare le tuple come chiavi e questo è OK.

Si noti che i dizionari in python non sono ordinati. Puoi utilizzare collections.OrderedDict per questo. Inoltre per creare un ordinamento corretto utilizzare sort/sorted functions con la chiave parametro specificata per ordinare il modo desiderato.

campione Modificato:

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]) 
+0

Ok, questo è utile. Questo si occupa del problema dell'ordine. Ma voglio usare le coordinate degli oggetti x, y, z come chiave per accedere a un altro tipo di oggetto memorizzato nel mio dizionario. Non sono sicuro di come abilitare un ampio intervallo di valori che saranno accettati per ogni chiave. Ha senso ciò? – user1846529

+0

@ user1846529 è necessario fornirci un campione di input chiave e di cosa hai bisogno - per me tutto ciò che dici sembra ok e dovrebbe funzionare –

+0

La mia chiave sarà simile a questa (1.8,12.3,24.9) e ci deve essere una un intervallo di valori che saranno accettati per ogni parte della chiave. Quindi (1,12,24) soddisferebbe anche i criteri per la chiave o (2,13,25) potrebbe anche funzionare ... – user1846529

3

Speriamo che troverete questo utile.

>>> 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] 
1

Mi sembra che si desidera una raccolta possibilmente non ordinata di mappature da chiavi (ordinato triple) a valori (oggetti). Se questo è il caso, è molto facile fare una chiave composta da un triplice ordinata:

Supponiamo obj0 è in x, y, z coordinate (10,20,30) e obj1 è in x, y, z coordinate (11,21,31). Poi:

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

Questo funziona perché entrambi tuple s e int s sono tipi immutabili

Speranza che aiuta

+0

Questo è vicino, tuttavia voglio che gli oggetti accettino un ampio intervallo di valori per ogni parte della chiave. Ad esempio, la prima parte della chiave potrebbe accettare qualsiasi valore compreso tra 1 e 100 e la seconda parte potrebbe accettare qualsiasi valore compreso tra 100 e 200. Non sono sicuro di come farlo ... – user1846529

+0

Si potrebbe fare altrettanto facilmente '{ (101, 280,35): obj1} '. Stai cercando qualcosa che controlli gli intervalli al momento dell'inserimento di una nuova chiave? – inspectorG4dget

+0

Quando inserisco una nuova chiave, voglio che il dizionario sappia che i valori inseriti sono all'interno di un intervallo specifico che corrisponde ad un oggetto memorizzato nel dizionario. – user1846529

Problemi correlati