在什么情况下我会将元组用作字典键?
我在研究列表和元组的区别(在Python中)。一个明显的区别是,元组是不可变的(也就是说,赋值后不能更改里面的值),而列表是可变的。
文章中有一句话让我印象深刻:
只有不可变的元素才能用作字典的键,因此只有元组而不是列表可以用作键。
我很难想象一个场景,在这个场景中我会想用元组作为字典的键。你能给我举个例子,说明在什么情况下使用元组作为字典键是自然的、高效的、优雅的或者显而易见的解决方案吗?
编辑:
谢谢你的例子。到目前为止,我了解到一个非常重要的应用是函数值的缓存。
13 个回答
12
在机器学习和深度学习的领域,如果你正在寻找最佳的超参数组合,那么使用元组作为键会非常有用。
比如说,你想找到最佳的超参数组合,包括学习率
、正则化因子
和模型复杂度
。
你可以在Python中创建一个字典,把这些超参数的不同组合作为键,而它们对应的训练算法的权重矩阵作为值。
hparams_hist = {}
hparams_hist[(0.001, 0.7, 5)] = weight_matrix1
hparams_hist[(0.0001, 0.8, 2)] = weight_matrix2
这些权重矩阵在进行实时预测时是必需的。
39
salaries = {}
salaries[('John', 'Smith')] = 10000.0
salaries[('John', 'Parker')] = 99999.0
编辑 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
>>>
148
经典例子:你想把一个点的坐标存储为一个元组,格式是 (x, y)