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

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.


Gar*_*tty 8

在Python 3.x中,dict.keys()不返回列表,它返回一个iterable(特别是一个字典视图).在大多数情况下,dict直接使用是优选的,因为它本身是可迭代的,并且需要更少的代码.

如果要获取单个任意项(因为字典是无序的,顺序是任意的,所以'first'元素是任意的),next(iter(dict))而是使用.

(我们从字典视图中获取iterable,然后使用collections.OrderedDict它来推进它并获取项目).

如果你需要遍历项目 - 只需直接迭代iter().

这些都有利于使用,next()因为它意味着不构造列表 - 使其更快和更高的内存效率(因此list()在3.x中更改默认行为的原因).