¿Cómo hago un diccionario con varias claves a un valor?

Tengo una pregunta sobre un diccionario que quiero hacer. Mi objective es tener varias claves para un solo valor, como a continuación:

dictionary = {('a', 'b'): 1, ('c', 'd'): 2} assert dictionary['a'] == 1 assert dictionary['b'] == 1 

¿Algunas ideas?

Supongo que te refieres a esto:

 class Value: def __init__(self, v=None): self.v = v v1 = Value(1) v2 = Value(2) d = {'a': v1, 'b': v1, 'c': v2, 'd': v2} d['a'].v += 1 d['b'].v == 2 # True 
  • Las cuerdas y números de Python son objetos inmutables ,
  • Por lo tanto, si desea que d['a'] y d['b'] apunten al mismo valor que “actualiza” a medida que cambia, haga que el valor se refiera a un objeto mutable (clase definida por el usuario como arriba, o a dict , list , set ).
  • Luego, cuando modifica el objeto en d['a'] , d['b'] cambia al mismo tiempo porque ambos apuntan al mismo objeto.

Su ejemplo crea múltiples pares de clave: valor si se usa desde fromkeys . Si no quieres esto, puedes usar una clave y crear un alias para la clave. Por ejemplo, si está utilizando un mapa de registro, su clave puede ser la dirección del registro y el alias puede ser el nombre del registro. De esa manera puede realizar operaciones de lectura / escritura en el registro correcto.

 >>> mydict = {} >>> mydict[(1,2)] = [30, 20] >>> alias1 = (1,2) >>> print mydict[alias1] [30, 20] >>> mydict[(1,3)] = [30, 30] >>> print mydict {(1, 2): [30, 20], (1, 3): [30, 30]} >>> alias1 in mydict True 

Si va a agregar a este diccionario con frecuencia, querría tomar un enfoque basado en clases, algo similar a la respuesta de @ Latty en esta pregunta SO 2d-diccionario-con-muchas-teclas-que-regresará-el -el mismo valor .

Sin embargo, si tiene un diccionario estático, y solo necesita acceder a los valores con varias teclas, entonces podría seguir la ruta muy simple de usar dos diccionarios. Una para almacenar la asociación de clave de alias y otra para almacenar sus datos reales:

 alias = { 'a': 'id1', 'b': 'id1', 'c': 'id2', 'd': 'id2' } dict = { 'id1': 1, 'id2': 2 } dict[alias['a']] 

Si necesita agregar al diccionario, puede escribir una función como esta para usar ambos diccionarios:

 def add(key, id, value=None) if id in dict: if key in alias: # Do nothing pass else: alias[key] = id else: dict[id] = value alias[key] = id add('e', 'id2') add('f', 'id3', 3) 

Si bien esto funciona, creo que, en última instancia, si quieres hacer algo como esto, escribir tu propia estructura de datos es probablemente el camino a seguir, aunque podría usar una estructura similar.

Es simple. Lo primero que debes entender es el diseño del intérprete de Python. No asigna memoria para todas las variables, básicamente, si alguna de las dos o más variables tiene el mismo valor, simplemente se asigna a ese valor.

vamos al ejemplo de código,

 In [6]: a = 10 In [7]: id(a) Out[7]: 10914656 In [8]: b = 10 In [9]: id(b) Out[9]: 10914656 In [10]: c = 11 In [11]: id(c) Out[11]: 10914688 In [12]: d = 21 In [13]: id(d) Out[13]: 10915008 In [14]: e = 11 In [15]: id(e) Out[15]: 10914688 In [16]: e = 21 In [17]: id(e) Out[17]: 10915008 In [18]: e is d Out[18]: True In [19]: e = 30 In [20]: id(e) Out[20]: 10915296 

Desde la salida anterior, las variables a y b comparten la misma memoria, c y d tienen una memoria diferente cuando creo una nueva variable e y almaceno un valor (11) que ya está presente en la variable c, por lo que se asignó a esa ubicación de memoria y no crea una nueva memoria cuando cambio el valor presente en la variable e a 21, que ya está presente en la variable d, por lo que ahora las variables d y e comparten la misma ubicación de memoria. Finalmente, cambio el valor en la variable e a 30 que no está almacenado en ninguna otra variable, por lo que crea una nueva memoria para e.

por lo que cualquier variable que tenga el mismo valor comparte la memoria.

No para objetos de lista y diccionario.

vamos a tu pregunta

cuando varias claves tienen el mismo valor, todas comparten la misma memoria, por lo que lo que esperas ya está allí en Python.

simplemente puedes usarlo así

 In [49]: dictionary = { ...: 'k1':1, ...: 'k2':1, ...: 'k3':2, ...: 'k4':2} ...: ...: In [50]: id(dictionary['k1']) Out[50]: 10914368 In [51]: id(dictionary['k2']) Out[51]: 10914368 In [52]: id(dictionary['k3']) Out[52]: 10914400 In [53]: id(dictionary['k4']) Out[53]: 10914400 

Desde la salida anterior, la clave k1 y k2 se asignaron a la misma dirección, lo que significa que el valor uno se almacenó solo una vez en la memoria, lo cual es un diccionario de valor único de clave múltiple. Esto es lo que desea. :PAG