我应该在什么情况下将元组用作字典键?

108
我正在学习Python中列表和元组的区别。一个明显的区别是,元组是不可变的(值在初始赋值后不能更改),而列表是可变的。
文章中的一句话让我困惑:
只有不可变元素才能用作字典键,因此只有元组而不是列表可以用作键。
我很难想象出什么情况下我会想要使用元组作为字典键。你能提供一个自然、高效、优雅或明显的解决方案的例子吗?
编辑:
感谢您的示例。到目前为止,我认为一个非常重要的应用是缓存函数值。

7
你可以使用元组,但只能使用其中具有不可变元素的元组。如果一个元组包含一个列表(作为其元素之一),则这样的元组不能用作键。基本规则是数据(元组)必须是可哈希的。 - pepr
13个回答

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()

0

如果我们要存储以下内容,我认为将元组作为字典键是很好的选择:

  1. 坐标系中的某些点。

  2. 有助于标记您在下一次迭代中想要的矩阵的位置。例如:

    flag = {(0,1): True, (1,0) = False}


-1
假设字典包含您的科目和分数。如果您在两个科目中获得相同的分数,那么我们可以使用元组。
D = {}
D[('math','history')] = 74

但是,如果您知道所有具有该标记的科目,那么您只能访问该标记。 - snakecharmerb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接