Esc*_*alo 65 python dictionary tuples list
我正在研究列表和元组之间的区别(在Python中).一个显而易见的是元组是不可变的(初始赋值后不能更改值),而列表是可变的.
文章中的一句话让我:
只有不可变元素可以用作字典键,因此只能使用元组而不是列表作为键.
我很难想到我想使用元组作为字典键的情况.您能提供一个示例问题,这将是一个自然,高效,优雅或明显的解决方案吗?
编辑:
谢谢你的例子.到目前为止,我认为一个非常重要的应用是缓存函数值.
Imr*_*ran 95
经典示例:您希望将点值存储为(x,y)的元组
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)
我使用元组很多时间作为dict关键例如
当我必须从多个值创建一个唯一键时,我会使用它们,例如
基于first_name,last_name键可能是键= '%s_%s'%(first_name, last_name)但更好的方法是key = (first_name, last_name)因为
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)我在应用程序中使用元组作为字典键,该应用程序按地理位置比较网络设备。由于设备在每个位置的命名都相似,因此它提供了一种自然的方式来知道在处理倍数时是否已经看到与该配对匹配的设备。
即
seen = {}
seen[('abc', 'lax')] = 1
seen[('xyz', 'nyc')] = 1
Run Code Online (Sandbox Code Playgroud)
当您想显示在一起构成一个键的多个元素时,可以使用元组作为键。
例如: {(<x-coordinate>,<y-coordinate>): <indicating letter>}
在这里,如果我们单独使用x-coordinate或y-coordinate单独使用,我们将不会代表这一点。
在机器学习和深度学习的背景下,如果您正在为最佳超参数进行超参数搜索,那么使用元组作为键绝对是非常有用的。
比方说,你正在寻找最佳结合超参数learning_rate,regularization_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)
进一步需要这些权重矩阵来进行实时预测。