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

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

文章中的一句话让我感到:

只有不可变元素可以用作字典键,因此只有元组而不是列表可以用作关键字。

我很难考虑一个我想用元组作为字典键的情况。 您能否提供一个示例问题,这将是一个自然,高效,优雅或明显的解决scheme?

编辑:

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

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

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

编辑1当然,你可以做salaries['John Smith'] = whatever ,但那么你将不得不做额外的工作,把钥匙分为姓和名。 那么pointColor[(x, y, z)] = "red"怎么样,这里tuple key的好处更加突出。

我必须强调,这不是最好的做法。 在许多情况下,你最好创build特殊的类来处理这种情况,但阿列塔要求我给他(他)的例子。

编辑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

  • 当我必须从多个值创build唯一的密钥时,我确实使用它们

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

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

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

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

 seen = {} seen[('abc', 'lax')] = 1 seen[('xyz', 'nyc')] = 1 

我想在sorting的情况下,使用元组可能有优点。 例如,假设字典键表示一个sorting字段(显然会有一个默认sorting字段来防止该键为None )。 如果你需要多个sorting字段,比如按姓氏sorting的话,那么名字不会使用元组作为字典键是个好主意吗?

当然,这样的想法可能用途有限,但这并不意味着它是完全无用的。

当你想要显示多个组成键的元素时,你可以使用元组作为键。

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

在这里,如果我们分别使用x-coordinatey-coordinate ,那么我们不会代表那个点。

您可以使用它在search空间中进行大约恒定时间的search。 例如,您可以将其用于约束满足问题,其中每个元组可能包含一些约束。 约束的forms可以是(v1.v2),其中color(v1)!= color(v2)用于着色问题等。使用元组作为字典关键字,可以在常量时间内判断排列是否满足约束条件。

 a[("John", "Doe")] = "123 Fake Street" 

如果您正在构build基本分析工具,则可以将其用于漏斗分析。

例如 ,计算在text2上hover后有多less人点击了image3。

  funnels = defaultdict(int) funnels[('hovered_text2', 'clicked_image3')] += 1 
 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() 

在机器学习和深度学习的情况下,如果你正在做超参数search最好的超参数 ,那么使用元组作为密钥绝对是非常有用的。

假设您正在为learning_rateregularization_factormodel_complexity寻找最好的超参数组合。

然后,您可以在Python中创build一个字典,您可以将这些hparams可以作为关键字的不同组合以及来自训练algorithm的相应权重matrix作为

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

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