62

我有这句话:

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

4

3 回答 3

105

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

list(prob)[0]

或者更好的是仍然使用:

next(iter(dict))

任何一种方法都适用于 Python 23,并且next()对于 Python 2,该选项肯定比使用dict.keys(). 但是请注意,字典没有固定的顺序,您将知道首先列出哪个键。

看起来好像您正在尝试找到最大键,请使用max()with dict.get

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

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

于 2013-09-08T18:04:07.453 回答
12

在 Python 3.x 中,dict.keys()不返回列表,而是返回一个可迭代对象(特别是字典视图)。值得注意的是,dict它本身也是一个可迭代的键。

如果要获取第一个密钥,请next(iter(dict))改用。(请注意,在 Python 3.6 字典之前是无序的,因此“第一个”元素是任意元素。从 3.6 开始,它将基于插入顺序。如果您在旧版本中需要该行为或具有跨版本兼容性,您可以使用collections.OrderedDict) .

这很简单:我们从字典视图中获取 iterable iter(),然后使用next()将其前进一个并获取第一个键。

如果你需要遍历键——那么绝对没有必要构造一个列表:

for key in dict:
    ...

与 using 相比,这些都是有利的,list()因为这意味着未构造列表 - 使其更快且内存效率更高(因此keys()在 3.x 中更改了默认行为)。即使在 Python 2.x 中,你最好还是做next(iter(dict.iterkeys()).

请注意,所有这些都适用于dict.values()并且也适用dict.items()

于 2013-09-08T18:01:36.057 回答
1

我已经成功地将从字典中获取的可迭代对象转换为列表。因此,对于 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)
于 2018-06-07T19:09:56.593 回答