¿En qué caso utilizaría una tupla como clave de diccionario?

Estaba estudiando la diferencia entre listas y tuplas (en Python). Una obvia es que las tuplas son inmutables (los valores no pueden cambiarse después de la asignación inicial), mientras que las listas son mutables.

Una frase en el artículo me consiguió:

Solo los elementos inmutables se pueden usar como claves de diccionario, y por lo tanto solo las tuplas y no las listas se pueden usar como claves.

Me cuesta mucho pensar en una situación en la que me gustaría usar una tupla como clave de diccionario. ¿Puede proporcionar un problema de ejemplo donde esta sería la solución natural, eficiente, elegante u obvia?

Editar:

Gracias por tus ejemplos. Hasta ahora, considero que una aplicación muy importante es el almacenamiento en caché de los valores de las funciones.

Ejemplo clásico: desea almacenar el valor en puntos como tupla de (x, y)

salaries = {} salaries[('John', 'Smith')] = 10000.0 salaries[('John', 'Parker')] = 99999.0 

EDITAR 1 Por supuesto que puede pagar salaries['John Smith'] = whatever , pero luego tendrá que hacer un trabajo adicional para separar la clave en nombres y apellidos. ¿Qué pasa con pointColor[(x, y, z)] = "red" , aquí el beneficio de la clave de tupla es más prominente?

Debo recalcar que esta no es la mejor práctica. En muchos casos, es mejor que crees clases especiales para manejar situaciones como esa, pero Arrieta pidió ejemplos, que le di a él (a él).

EDITAR 0

Por cierto, cada elemento de la tupla también debe ser hashable:

 >>> d = {} >>> t = (range(3), range(10, 13)) >>> d[t] = 11 Traceback (most recent call last): File "", line 1, in  TypeError: list objects are unhashable >>> 

Uso tuple mucho tiempo como clave de dict por ejemplo

  • Los uso cuando tengo que crear una clave única a partir de múltiples valores, por ejemplo

    basado en first_name , last_name key podría ser key = '%s_%s'%(first_name, last_name) pero una mejor manera es key = (first_name, last_name) porque

    1. Es más legible, más corto y menos computable.
    2. Es más fácil recuperar los valores individuales.
    3. Lo más importante es que la key = '%s_%s'%(first_name, last_name) es incorrecta y no puede proporcionar claves únicas para todos los valores de first_name y last_name por ejemplo, cuando los valores contienen _
  • Cachear los resultados de una función.

     def func(a1, b1): if (a1,b1) in cache: return cache[(a1,b1)] ... 

Utilicé tuplas como claves de diccionario en una aplicación que compara dispositivos de red por ubicación geográfica. Dado que los dispositivos se nombran de manera similar para cada ubicación, proporciona una manera natural de saber si se ha visto un dispositivo que coincida con el emparejamiento mientras se procesan los múltiplos.

es decir

 seen = {} seen[('abc', 'lax')] = 1 seen[('xyz', 'nyc')] = 1 

Utiliza tuplas como claves cuando quiere mostrar varios elementos que forman una clave juntos.

Por ejemplo: {(,): }

Aquí, si usamos x-coordinate o la x-coordinate y-coordinate separado, no estaríamos representando ese punto.

Supongo que en el caso de la clasificación, podría haber mérito en el uso de una tupla. Por ejemplo, supongamos que la clave del diccionario representa un campo de clasificación (obviamente, habría un campo de clasificación predeterminado para evitar que la clave sea None ). Si necesitara varios campos de clasificación, como el caso de la clasificación por apellido, luego el primer nombre, ¿no sería una buena idea usar una tupla como clave del diccionario?

Claro, tal idea podría tener un uso limitado, pero eso no significa que sea completamente inútil.

Puede usarlo para la búsqueda de un punto en el espacio de búsqueda en un tiempo constante. Por ejemplo, puede usarlo para problemas de satisfacción de restricciones, donde cada tupla puede contener algunas restricciones. La restricción puede ser de la forma (v1.v2) donde color (v1)! = Color (v2) para colorear prob, etc. Usando tuplas como claves de diccionario, podrá decir en tiempo constante si una permutación satisface una restricción o no .

En el contexto del Aprendizaje automático y el Aprendizaje profundo, si está haciendo una búsqueda de hiperparámetros para los mejores hiperparámetros , el uso de tuplas como claves es definitivamente muy útil.

Digamos que está buscando la mejor combinación de hiperparámetros para learning_rate , regularization_factor y model_complexity .

Luego, puede tener un diccionario en Python donde puede hacer las diferentes combinaciones que estos hparams pueden tomar como claves y sus matrices de peso correspondientes del algoritmo de entrenamiento como valores.

 hparams_hist = {} hparams_hist[(0.001, 0.7, 5)] = weight_matrix1 hparams_hist[(0.0001, 0.8, 2)] = weight_matrix2 

Estas matrices de peso son necesarias para hacer predicciones en tiempo real.

 a[("John", "Doe")] = "123 Fake Street" 

Puede usarlo para el análisis de embudo si está construyendo una herramienta de análisis básica.

Por ejemplo , contando cuántas personas hicieron clic en la imagen3 después de pasar el cursor sobre texto2.

  funnels = defaultdict(int) funnels[('hovered_text2', 'clicked_image3')] += 1 
 def getHash(word): result={} for i in range(len(word)): if word[i] in result: result[word[i]]+=1 else : result[word[i]]=1 return tuple (sorted((result.items()))) def groupAnagrams(words): resultHash={} for i in range(len(words)): s=getHash(words[i].lower()) #print s if s in resultHash : l=list(resultHash[s]) l.append(words[i]) resultHash[s] = l # list(resultHash[s]).append(words[i]) else : resultHash[s]=[words[i]] # Creating list return resultHash.values()