繁体   English   中英

返回字典中的第一个键 - Python 3

[英]Return the first key in Dictionary - Python 3

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

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

我收到错误

'dict_keys' object does not support indexing

上面提到的代码有什么问题?

接受的输出:

Key2
Value2

最短:

mydict = {"Key1" : "Value1", "Key2" : "Value2"}
print( next(iter(mydict)) ) # 'Key1'

对于键和值:

print( next(iter( mydict.items() )) ) # ('Key1', 'Value1')

在 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

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

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

编辑:

根据@Mseifert 的评论(感谢),从无序字典转换为有序字典后保留顺序只是一个在 python3.6 中有效的实现细节,我们不能依赖,这里是 Mseifert 分享的讨论:

所以做你想做的正确方法是明确定义顺序

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

字典是无序的,在较新的 Python 版本中,字符串的哈希是随机的(每个会话)。 所以你必须接受你得到的作为字典的“n”个键(或值)是不可预测的(至少当键是字符串时)。

但是,如果您只想要恰好是“第一个”(或“第二个”)的元素,只需使用listdict_keys转换为可以索引的序列:

print(list(data.keys())[1])   
print(list(data.values())[1])

但是,我的建议是使用OrderedDict而不是普通的 dict 来使结果具有确定性:

from collections import OrderedDict
data = OrderedDict([("Key1", "Value1"), ("Key2", "Value2")])
print(list(data.keys())[1])     # Key2
print(list(data.values())[1])   # Value2

在 Python 中, dict是无序的数据结构。 因此没有第一把钥匙。 如果您想拥有具有内部键排序的dict式数据结构,请查看OrderedDict

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

以你的例子为例:

>>> data = {"Key1" : "Value1", "Key2" : "Value2"}

现在添加键0

>>> data[0] = "Value0"
>>> data
{'Key1': 'Value1', 'Key2': 'Value2', 0: 'Value0'}

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

>>> data = {0: "Value0", "Key1" : "Value1", "Key2" : "Value2"}

你得到这个结果

>>> data
{0: 'Value0', 'Key1': 'Value1', 'Key2': 'Value2'}

这说明了不应该依赖于排序的原则,它仅由 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'

圭多在这个问题上是这样说的:

我想对... dicts 的顺序表示感谢。 是的,在 CPython 3.6 和 PyPy 中,它们都是有序的,但这是一个实现细节。 我不想强迫所有其他实现效仿。 我也不希望太多人开始依赖于此,因为他们的代码将在 3.5 中崩溃。 (需要依赖关键字 args 或类属性排序的代码应该比较少见;但是人们会开始太容易依赖所有 dicts 的排序。我想提醒他们,他们正在冒险,他们的代码不会向后兼容。)

完整的帖子在这里

对于 Python 3,你可以简单地做

first_key = next(iter(data.keys()))
print(first_key)   # 'Key1'

字典表示无序数据类型,因此没有索引。 集合中有一个选项。 试试 OrderedDict。

import collections

d = collections.OrderedDict()
d['Key1'] = 'Value1'
d['Key2'] = 'Value2' # that's how to add values to OrderedDict

items = list(d.items())
print(items)
#[('Key1', 'Value1'), ('Key2', 'Value2')]
print(items[0])
#('Key1', 'Value1')
print(items[1])
#('Key2', 'Value2')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM