在什么情况下我会使用元组作为字典键?

Esc*_*alo 65 python dictionary tuples list

我正在研究列表和元组之间区别(在Python中).一个显而易见的是元组是不可变的(初始赋值后不能更改值),而列表是可变的.

文章中的一句话让我:

只有不可变元素可以用作字典键,因此只能使用元组而不是列表作为键.

我很难想到我想使用元组作为字典键的情况.您能提供一个示例问题,这将是一个自然,高效,优雅或明显的解决方案吗?

编辑:

谢谢你的例子.到目前为止,我认为一个非常重要的应用是缓存函数值.

Imr*_*ran 95

经典示例:您希望将点值存储为(x,y)的元组

  • 哇.这是非常正确的.我想不出有效存储函数值的任何其他方法!如果您的功能评估非常昂贵,您只需执行一次,并存储这些点以供日后检索.+1!谢谢! (4认同)
  • 同意.此外,您在内存中处理某些内容的位置,您将使用复合键来处理关系数据库中的相同内容. (3认同)

Bor*_*lik 26

salaries = {}
salaries[('John', 'Smith')] = 10000.0
salaries[('John', 'Parker')] = 99999.0
Run Code Online (Sandbox Code Playgroud)

编辑1 当然你可以做salaries['John Smith'] = whatever,但是你必须做额外的工作来将密钥分成名字和姓氏.那么pointColor[(x, y, z)] = "red",这里元组键的好处更加突出.

我必须强调,这不是最好的做法.在许多情况下,你最好创建特殊的类来处理这样的情况,但是Arrieta问了一些例子,我给了她(他).

编辑0

顺便说一下,每个元组元素也必须是可以清洗的:

>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您不需要括号,元组由逗号定义.`薪水['John','Smith'] = 10000.0`也会起作用:) (4认同)
  • 我不太使用python,但是工资[('John Smith')] = 99998是一个有效的字典密钥? (2认同)

Anu*_*yal 8

我使用元组很多时间作为dict关键例如

  • 当我必须从多个值创建一个唯一键时,我会使用它们,例如

    基于first_name,last_name键可能是键= '%s_%s'%(first_name, last_name)但更好的方法是key = (first_name, last_name)因为

    1. 它更具可读性,更短,更少计算
    2. 检索单个值更容易
    3. 最重要的key = '%s_%s'%(first_name, last_name)是错误,并且可能不会为所有值提供唯一键first_name,last_name例如当值包含时_
  • 缓存函数的结果

    def func(a1, b1):
        if (a1,b1) in cache: return cache[(a1,b1)]
        ...
    
    Run Code Online (Sandbox Code Playgroud)


jat*_*ism 5

我在应用程序中使用元组作为字典键,该应用程序按地理位置比较网络设备。由于设备在每个位置的命名都相似,因此它提供了一种自然的方式来知道在处理倍数时是否已经看到与该配对匹配的设备。

seen = {}
seen[('abc', 'lax')] = 1
seen[('xyz', 'nyc')] = 1
Run Code Online (Sandbox Code Playgroud)


Ani*_*non 5

当您想显示在​​一起构成一个键的多个元素时,可以使用元组作为键。

例如: {(<x-coordinate>,<y-coordinate>): <indicating letter>}

在这里,如果我们单独使用x-coordinatey-coordinate单独使用,我们将不会代表这一点。


kma*_*o23 5

在机器学习和深度学习的背景下,如果您正在为最佳超参数进行超参数搜索,那么使用元组作为键绝对是非常有用的。

比方说,你正在寻找最佳结合超参数learning_rateregularization_factor以及model_complexity

然后你可以在 Python 中有一个字典,你可以在其中进行不同的组合,这些 hparams 可以作为键,并将它们对应的训练算法中的权重矩阵作为

hparams_hist = {}
hparams_hist[(0.001, 0.7, 5)] = weight_matrix1
hparams_hist[(0.0001, 0.8, 2)] = weight_matrix2
Run Code Online (Sandbox Code Playgroud)

进一步需要这些权重矩阵来进行实时预测。

  • 我发现自己经常这样做!很好的例子。 (3认同)