[英]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”个键(或值)是不可预测的(至少当键是字符串时)。
但是,如果您只想要恰好是“第一个”(或“第二个”)的元素,只需使用list
将dict_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.