返回Dictionary中的第一个键 - Python 3

8 python python-3.x

我正在尝试使用以下代码打印密钥和值:

data = {"Key1" : "Value1", "Key2" : "Value2"}
print(data.keys()[1])   
print(data.values()[1])
Run Code Online (Sandbox Code Playgroud)

我收到了错误

'dict_keys' object does not support indexing
Run Code Online (Sandbox Code Playgroud)

提到的代码有什么问题?

接受的输出:

Key2
Value2
Run Code Online (Sandbox Code Playgroud)

css*_*hus 11

最短:

mydict = {"Key1" : "Value1", "Key2" : "Value2"}
print( next(iter(mydict)) ) # 'Key1'
Run Code Online (Sandbox Code Playgroud)

对于键和值:

print( next(iter( mydict.items() )) ) # ('Key1', 'Value1')
Run Code Online (Sandbox Code Playgroud)


Moh*_*OUI 8

在python3中data.keys()返回一个dict_keys对象,因此,通常,在其上应用列表以便能够对其进行索引/切片:

data = {"Key1" : "Value1", "Key2" : "Value2"}
print(data.keys()) 
# output >>> dict_keys(['Key1', 'Key2'])
print(list(data.keys())[1])   
# output >>> Key2
print(list(data.values())[1])
# output >>> Value2
Run Code Online (Sandbox Code Playgroud)

对于您的特定情况,您需要将字典转换为有序字典以保存顺序并获取第一个元素,如下所示:

from collections import OrderedDict 
data = {"Key1" : "Value1", "Key2" : "Value2"}
data = OrderedDict(data)
print(data)
# output >>> OrderedDict([('Key1', 'Value1'), ('Key2', 'Value2')])
print(list(data.keys())[0])
# output >>> Key1
Run Code Online (Sandbox Code Playgroud)

编辑:

基于从@Mseifert(感谢)的意见,从无序字典有序一个转换后保存的顺序是唯一一个实现细节,在python3.6工作,我们不能依靠,这里的Mseifert共同讨论:

因此,执行所需操作的正确方法是明确定义顺序

from collections import OrderedDict
data = OrderedDict([('Key1', 'Value1'), ('Key2', 'Value2')])
print(list(data.keys())[0])
Run Code Online (Sandbox Code Playgroud)


Boa*_*les 1

这确实取决于您所说的首先是什么意思。在 Python 3.6 中,字典中的条目按键排序,但可能与您期望的方式不太一样。

以你的例子为例:

>>> data = {"Key1" : "Value1", "Key2" : "Value2"}
Run Code Online (Sandbox Code Playgroud)

现在添加密钥0

>>> data[0] = "Value0"
>>> data
{'Key1': 'Value1', 'Key2': 'Value2', 0: 'Value0'}
Run Code Online (Sandbox Code Playgroud)

所以最后是零。但是如果你从头开始构建字典,就像这样:

>>> data = {0: "Value0", "Key1" : "Value1", "Key2" : "Value2"}
Run Code Online (Sandbox Code Playgroud)

你会得到这个结果

>>> data
{0: 'Value0', 'Key1': 'Value1', 'Key2': 'Value2'}
Run Code Online (Sandbox Code Playgroud)

这说明了一个原则,即您不应依赖于顺序,该顺序仅由 dict 实现定义,在 CPython 3.6 及更高版本中,它是条目的顺序。用不同的方式来说明这一点:

>>> data = {0: "Value0", "Key1" : "Value1", "Key2" : "Value2"}
>>> sorted(data.keys())
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    sorted(data.keys())
TypeError: '<' not supported between instances of 'str' and 'int'
Run Code Online (Sandbox Code Playgroud)

Guido 对于这个问题有这样的说法:

我想就……命令的顺序挥手。是的,在 CPython 3.6 和 PyPy 中它们都是有序的,但这是一个实现细节。我不想强迫所有其他实现也效仿。我也不希望太多人开始依赖于此,因为他们的代码将在 3.5 中崩溃。(需要依赖于关键字参数或类属性的顺序的代码应该相对不常见;但是人们会开始太容易地依赖于所有字典的顺序。我想提醒他们,他们正在冒险,他们的代码不会向后兼容。)

完整的帖子在这里


归档时间:

查看次数:

23208 次

最近记录:

7 年,3 月 前