Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3上的dict.keys()[0]_Python_Python 3.x_Dictionary_Dictview - Fatal编程技术网

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

Python 3上的dict.keys()[0],python,python-3.x,dictionary,dictview,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]

我有这样一句话:

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
这是版本问题吗?我在Python3.x中使用的是Python3.3.2,它不返回列表,而是返回一个iterable(特别是,)。值得注意的是,
dict
本身也是一个iterable键

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

这非常简单:我们使用
iter()
从dictionary视图获取iterable,然后使用
next()
将其向前推进一步并获得第一个键

如果需要迭代键,则绝对不需要构建列表:

for key in dict:
    ...
与使用
list()
相比,这些都是有利的,因为这意味着列表没有被构造-使其更快、内存效率更高(因此
keys()
的默认行为在3.x中发生了更改)。即使在Python2.x中,您也最好执行
下一步(iter(dict.iterkeys())

注意所有这些都适用于
dict.values()
dict.items()

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

list(prob)[0]
或者最好还是使用:

next(iter(dict))
这两种方法都适用于Python2和Python3,对于Python2来说,
next()
选项肯定比使用
dict.keys()
更有效。但是请注意,字典没有设置顺序,您不知道将首先列出哪个键

如果您试图查找最大密钥,请将
max()
dict.get
一起使用:

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

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

我已经成功地将字典中的iterables转换为列表。 因此,对于Python3.6中的dic.keys()、dic.values()和dic.items(),您可以:

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)

这个函数应该实现什么?你的随机数对结果没有影响,你基本上是选择一个值最大的键。@MartijnPieters
next()
需要一个迭代器,而不是iterable。
next(iter(dict))
更简洁一些。啊,是的,我刚才也明白了。注意,在python 3.6中,字典是默认排序的,我知道这篇文章可能是以前的,但可能值得更新this@SBFRF事实上,我已经改变了关于“第一个”的注释元素的意思是明确区分。虽然它没有改变问题的核心,但同样的方法仍然是最优的,只是有一个更具体的结果。@GarethLatty同意