字典中的AttributeError

时间:2016-03-18 20:00:34

标签: python dictionary

我找到了一种可以让我使用以下值获取字典键的方法:

mydic.keys()[mydic.values().index(value)]

我的代码如下:

def déchiffrement(code, dico):
    taille3 = len(code)
    décodé = []
    for i in range(taille3):
        décodé.insert(i, dico.keys()[dico.values().index(code[i])])
    return décodé

dico是一个如下字典:

dico = {
    "A": [1, 9],
    "B": [12, 19],
    ...
    "Z": [78, 108],
}

code是与字母对应的数字列表。 dico中的数字永远不会相同。

然而,我得到了

  

AttributeError:'dict_values'对象没有属性'index'

我不明白,因为这段代码似乎适用于其他人的代码。

2 个答案:

答案 0 :(得分:1)

Orange's answer以及对您的问题评论的评论是正确的;你(大概)是使用Python 3,其中dict.values()返回dictionary view object而不是list,并且不提供index()函数。

但是,您似乎希望将每个代码单独映射回原始字符。为此,预先计算解码器要清晰得多:

def invert(dico):
    # map values to keys, note the nested comprehension
    return {i: k for k, v in dico.items() for i in v}

def decipher(code, dico):
    # note that this result can be cached or even just
    # computed outside the function
    decoder = invert(dico)

    # pass each code through the decoder map
    return [decoder[c] for c in code]

print decipher([1, 9, 108], {
    'A': [1, 9],
    'B': [12, 19],
    'C': [78, 108]
})

输出

['A', 'A', 'C']

答案 1 :(得分:0)

indexlist的函数,而不是dict_values返回的dico.values()对象的函数。因此,请更改代码,以便将dico.values()转换为列表:

def déchiffrement(code,dico):
    taille3 = len(code)
    décodé = []
    for i in range(taille3):
        décodé.insert(i, dico.keys()[list(dico.values()).index(code[i])]) # Changed here
    return décodé