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

时间:2009-12-21 07:01:30

标签: python list dictionary tuples

我正在研究difference between lists and tuples(在Python中)。一个显而易见的是元组是不可变的(在初始赋值后不能更改值),而列表是可变的。

文章中的一句话让我:

  

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

我很难想到我想使用元组作为字典键的情况。您能提供一个示例问题,这将是一个自然,有效,优雅或明显的解决方案吗?

修改

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

11 个答案:

答案 0 :(得分:89)

经典示例:您希望将点值存储为(x,y)

的元组

答案 1 :(得分:24)

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

答案 2 :(得分:7)

我使用tuple大量时间作为dict键,例如

  • 当我必须从多个值创建唯一键时,我会使用它们,例如

    基于first_namelast_name密钥可以是密钥= '%s_%s'%(first_name, last_name),但更好的方法是key = (first_name, last_name),因为

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

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

答案 3 :(得分:4)

我在应用程序中使用元组作为字典键,按地理位置比较网络设备。由于每个位置的设备命名相似,因此它提供了一种自然的方式来了解在处理倍数时是否已经看到匹配该配对的设备。

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

答案 4 :(得分:4)

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

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

如果我们分别使用x-coordinatey-coordinate,我们就无法代表该点。

答案 5 :(得分:2)

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

当然,这样的想法可能会限制使用,但这并不意味着它完全没用。

答案 6 :(得分:2)

您可以将其用于搜索空间中某个点的近似恒定时间搜索。例如,您可以将其用于约束满足问题,其中每个元组可能包含一些约束。约束可能是(v1.v2)的形式,其中颜色(v1)!=颜色(v2)用于着色概率等。      使用元组作为字典键,您将能够在恒定时间内判断排列是否满足约束。

答案 7 :(得分:2)

在机器学习和深度学习的环境中,如果您正在进行超参数搜索最佳超参数,那么使用元组作为键肯定是非常有用的。

我们假设您正在为learning_rateregularization_factormodel_complexity搜索最佳超参数组合。

然后你可以在Python中创建一个字典,你可以将这些hparams作为 keys 的不同组合以及它们对应的训练算法中的权重矩阵作为 values < / p>

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

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

答案 8 :(得分:1)

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

答案 9 :(得分:1)

如果要构建基本的分析工具,可以将其用于漏斗分析。

例如,计算在将鼠标悬停在text2上后点击图片3的人数。

    funnels = defaultdict(int)
    funnels[('hovered_text2', 'clicked_image3')] += 1

答案 10 :(得分: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()