我正在尝试使用以下代码打印密钥和值:
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)
在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)
这确实取决于您所说的首先是什么意思。在 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 次 |
| 最近记录: |