我有这句话:
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
答案 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)