In what case would I use a tuple as a dictionary key?

89,924

Solution 1

Classic Example: You want to store point value as tuple of (x, y)

Solution 2

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

EDIT 1 Of course you can do salaries['John Smith'] = whatever, but then you'll have to do extra work to separate the key into first and last names. What about pointColor[(x, y, z)] = "red", here the benefit of tuple key is more prominent.

I must stress out that this is not the best practice. In many cases you better create special classes to handle situations like that, but Arrieta asked for examples, which I gave her (him).

EDIT 0

By the way, each tuple element has to be hashable too:

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

Solution 3

I use tuple lots of time as dict key e.g.

  • I do use them when I have to create a unique key from multiple values e.g.

    based on first_name, last_name key could be key = '%s_%s'%(first_name, last_name) but better way is key = (first_name, last_name) because

    1. It is more readable, shorter and less computation
    2. It is easier to retrieve the individual values
    3. Most importantly key = '%s_%s'%(first_name, last_name) is wrong and may not give unique keys for all values of first_name and last_name e.g. when values contain _
  • Caching the results of a function

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

Solution 4

In the context of Machine Learning and Deep Learning, if you're doing hyperparameter search for the best hyperparameters, then using tuples as keys is definitely super useful.

Let's say you're searching for the best hyperparameter combination for learning_rate, regularization_factor, and model_complexity.

Then you can have a dictionary in Python where you make the different combination that these hparams can take as keys and their corresponding weight matrices from the training algorithm as values

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

These weight matrices are further needed to make realtime prediction.

Solution 5

I used tuples as dictionary keys in application that compares network devices by geographical location. Since the devices are named similarly for each location, it provides a natural way to know if a device matching that pairing has been seen yet while processing multiples.

i.e.

seen = {}
seen[('abc', 'lax')] = 1
seen[('xyz', 'nyc')] = 1
Share:
89,924
Escualo
Author by

Escualo

I really like coding. My favorite languages are Python and C++. My favorite topic is numerical and scientific computing. Astrodynamics is my specialty, in particular spacecraft trajectory optimization, mission design, and orbit determination.

Updated on February 14, 2022

Comments

  • Escualo
    Escualo about 2 years

    I was studying the difference between lists and tuples (in Python). An obvious one is that tuples are immutable (the values cannot be changed after initial assignment), while lists are mutable.

    A sentence in the article got me:

    Only immutable elements can be used as dictionary keys, and hence only tuples and not lists can be used as keys.

    I have a hard time thinking of a situation where I would like to use a tuple as a dictionary key. Can you provide an example problem where this would be the natural, efficient, elegant, or obvious solution?

    Edit:

    Thanks for your examples. So far I take that a very important application is the caching of function values.

  • GrayWizardx
    GrayWizardx over 14 years
    I dont use python much, but wouldnt salaries[('John Smith')] = 99998 be a valid dictionary key?
  • Escualo
    Escualo over 14 years
    I agree you can do that, but I would model this data with a class Employee with __init__(self,Firs,Last,Salary), and create an instance for each element in the list. In this case, using the 'tuple as key' trick would appear a bit unnatural to me. What do you think?
  • Boris Gorelik
    Boris Gorelik over 14 years
    of course it would. But then you will have to do extra work if you want to split the key to, say, first and last names.
  • Escualo
    Escualo over 14 years
    Wow. This is very true. I cannot think of any other way of efficiently storing the function values! If your function is very expensive to evaluate, you only do it once, and store the points for later retrieval. +1! Thanks!
  • Joe Mabel
    Joe Mabel over 14 years
    Agreed. Also, anywhere you are handling something in memory where you would use a compound key to handle the same thing in a relational database.
  • Escualo
    Escualo over 14 years
    Thanks for your edits, I think the color example is very good, as the general dict[tuple] = f(tuple) mentioned in the answers. I'm a "him" by the way :)
  • Nandhini
    Nandhini over 14 years
    @GrayWizardx, 'John Smith' is a valid key but not necessarily unique, but ('John', 'Smith')
  • Peter Hansen
    Peter Hansen over 14 years
    @GrayWizardx, ('John Smith') is the same as 'John Smith', which would certainly be valid. Neither is a tuple though...
  • Heretron
    Heretron about 8 years
    Note that you don't need parentheses, tuples are defined by the comma. salaries['John', 'Smith'] = 10000.0 would work too :)
  • ruancomelli
    ruancomelli over 4 years
    I find myself doing this a lot! Great example.
  • shiv
    shiv about 4 years
    I'm implementing the exact same scenario now. What's the efficiency of search for retrieval? Is it O(1) or O(N)?