我正在研究列表和元组之间的区别(在Python中)。一个明显的事实是,元组是不可变的(在初始赋值后不能更改值),而列表是可变的。
文章中的一句话让我明白了:
只能将不可变元素用作字典键,因此只能将元组而不是列表用作键。
我很难考虑要使用元组作为字典键的情况。您能否提供一个示例问题,说明这是自然,高效,优雅或显而易见的解决方案?
编辑:
感谢您的示例。到目前为止,我认为一个非常重要的应用程序是函数值的缓存。
Answers:
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
>>>
dict[tuple] = f(tuple)
答案中提到的一般。顺便说一句,我是“他” :)
salaries['John', 'Smith'] = 10000.0
也会工作:)
我用元组很多时间作为dict
关键,例如
当必须从多个值创建唯一键时,我会使用它们
根据first_name
,last_name
key可能是key =,'%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)]
...
当要显示在一起构成一个键的多个元素时,可以使用元组作为键。
例如: {(<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
进一步需要这些权重矩阵进行实时预测。
您可以将其用于搜索空间中某个点的近似恒定时间搜索。例如,您可以将其用于约束满足问题,其中每个元组可能包含一些约束。约束的形式可能是(v1.v2),其中color(v1)!= color(v2)用于对概率进行着色等。使用元组作为字典键,您将能够在恒定时间内判断排列是否满足约束。 。
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()