Men*_*ito 41 python dictionary python-3.x 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
Run Code Online (Sandbox Code Playgroud)
但是当我调用它时,这个错误弹出:
TypeError: 'dict_keys' object does not support indexing
Run Code Online (Sandbox Code Playgroud)
这是版本问题吗?我正在使用Python 3.3.2
Mar*_*ers 70
dict.keys()是一本字典视图.list()如果你需要一个键列表,只需直接在字典上使用,第0项将是(任意)字典顺序中的第一个键:
list(prob)[0]
Run Code Online (Sandbox Code Playgroud)
或者更好的还是使用:
next(iter(dict))
Run Code Online (Sandbox Code Playgroud)
这两种方法都适用于Python 2 和 3,并且该next()选项对于Python 2而言比使用更有效dict.keys().但请注意,字典没有设置顺序,您将不知道首先列出哪个键.
看起来好像你正在努力寻找的最大关键,而应使用max()有dict.get:
def Ciudad(prob):
return max(prob, key=prob.get)
Run Code Online (Sandbox Code Playgroud)
对于任何给定的prob字典,函数结果肯定是相同的,因为您的代码在语句的随机数比较分支之间的代码路径上没有差异if.
在Python 3.x中,dict.keys()不返回列表,它返回一个iterable(特别是一个字典视图).在大多数情况下,dict直接使用是优选的,因为它本身是可迭代的,并且需要更少的代码.
如果要获取单个任意项(因为字典是无序的,顺序是任意的,所以'first'元素是任意的),next(iter(dict))而是使用.
(我们从字典视图中获取iterable,然后使用collections.OrderedDict它来推进它并获取项目).
如果你需要遍历项目 - 只需直接迭代iter().
这些都有利于使用,next()因为它意味着不构造列表 - 使其更快和更高的内存效率(因此list()在3.x中更改默认行为的原因).