Python 3上的dict.keys()[0]

时间:2013-09-08 18:00:52

标签: python python-3.x dictionary dictview

我有这句话:

def Ciudad(prob):
    numero = random.random()
    ciudad = prob.keys()[0]
    for i in prob.keys():
        if(numero > prob[i]):
            if(prob[i] > prob[ciudad]):
                ciudad = i
        else:
            if(prob[i] > prob[ciudad]):
                ciudad = i

    return ciudad

但是当我打电话给它时,会弹出错误:

TypeError: 'dict_keys' object does not support indexing

是版本问题吗?我正在使用Python 3.3.2

3 个答案:

答案 0 :(得分:56)

dict.keys()是一个字典视图。如果你需要一个键列表,只需直接在字典上使用list(),第0项将是(任意)字典顺序中的第一个键:

list(prob)[0]

或更好仍然只是使用:

next(iter(dict))

这两种方法都适用于Python 2 3,而next()选项对于Python 2来说肯定比使用dict.keys()更有效。但请注意,词典有设置顺序,您知道将首先列出哪个键。

看起来您正试图找到最大键,将max()dict.get一起使用:

def Ciudad(prob):
    return max(prob, key=prob.get)

对于任何给定的prob字典,函数结果肯定是相同的,因为您的代码在if语句的随机数比较分支之间的代码路径上没有差异。

答案 1 :(得分:7)

在Python 3.x中,dict.keys()不返回列表,它返回一个可迭代的(具体地,a dictionary view)。在大多数情况下,直接使用dict是可取的,因为它本身是可迭代的,并且需要的代码更少。

如果你想获得一个任意项(因为字典是无序的,顺序是任意的,所以'first'元素是任意的),而是使用next(iter(dict))

(我们从字典视图中获取iterable,然后使用next()将其推进一个并获取该项目。)

如果您需要迭代项目 - 只需直接在dict上进行迭代。

这些都有利于使用list(),因为它意味着没有构建列表 - 使其更快,更有内存效率(因此keys()的默认行为在3.x中发生了变化)

答案 2 :(得分:0)

我成功地将从字典中获取的迭代变成了一个列表。 因此,对于dic.keys(),dic.values()和dic.items(),在Python3.6中,您可以:

dic = {'a':3, 'b':2, 'c':3}
print(dic)

dictkeys = dic.keys() # or values/items
print(dictkeys)

keylist = []
keylist.extend(iter(dictkeys)) # my big revelation
print('keylist', keylist)