HOWTO · Python

如何在 Python 字典中获取第一个键

学习使用 next()、列表转换、for 循环以及针对空字典的安全默认值,获取 Python 字典迭代器产生的第一个键。

本页内容

要获取 Python 字典产生的第一个键,请调用 next(iter(my_dict))。这会直接从字典迭代器中读取一个键。在这个示例中,字典包含一个名字和一个城市,程序会打印最先产生的键:

my_dict = {"name": "Ada", "city": "London"}
first_key = next(iter(my_dict))
print(first_key)

字典中"第一个"的含义

字典不为键提供数字索引。这里的"第一个"是指 Python 迭代字典时产生的第一个键。对于有序字典,迭代遵循其插入顺序,因此第一个键是最早插入的键。如果某个映射使用不同的迭代顺序,“第一个"则遵循该映射的迭代行为。这个定义描述的是迭代结果;它并不假设每个映射都以相同方式排列其键。

字典迭代默认产生键。因此,你可以直接将字典传递给 iter() 或 for 循环。你不需要先调用 keys()。当你需要单独检查或重用键视图时,my_dict.keys() 方法会返回键的动态视图。

使用 next() 获取第一个键

使用 iter() 在字典上创建一个迭代器,然后使用 next() 检索它的下一个元素。由于字典迭代器产生键,这种方法读取一个键,而不必构建包含所有键的单独列表。对于非空字典,当你只需要一个键时,这是简洁的选择:

my_dict = {"name": "Ada", "city": "London"}
first_key = next(iter(my_dict))
print(first_key)

first_key 的值是迭代产生的第一个键。next() 还接受一个可选的默认值,当字典可能没有键时这很有用。最后一节展示了这种形式。

使用 list() 获取第一个键

如果你还需要将键作为列表使用,请将字典转换为列表并选择索引 0。传递给 list() 的字典会产生它的键,因此不需要先调用 keys():

my_dict = {"name": "Ada", "city": "London"}
first_key = list(my_dict)[0]
print(first_key)

这种转换会在选择一个键之前物化每个键。当你只需要一个键时,请使用迭代器方法。当结果列表还将被索引、切片或用于其他列表操作时,列表转换很有用。索引 0 要求列表包含一个键,因此当字典可能为空时,这种形式不适用,除非你先检查。

使用 for 循环获取第一个键

for 循环直接迭代字典键。赋予第一个键,然后使用 break 在该次迭代后停止:

my_dict = {"name": "Ada", "city": "London"}
for key in my_dict:
    first_key = key
    break
print(first_key)

这种方法适用于已经使用循环的代码,或者需要在停止前用键执行某项操作的代码。它避免了将所有键转换为列表。当值不被使用时,循环不需要 items()。如果字典不包含键,循环体永远不会运行,因此之后使用 first_key 的代码应该考虑这种可能性。

处理空字典

当字典没有键时调用 next(iter(my_dict)) 会引发 StopIteration。向 next() 传递第二个参数,以返回一个替代值:

my_dict = {}
first_key = next(iter(my_dict), None)
print(first_key)

在这里,None 是替代值。选择一个不会与有效字典键混淆的默认值。如果 None 在你的数据中可能是一个键,请创建一个唯一对象作为哨兵,并将其用作默认值:

my_dict = {"name": "Ada", "city": "London"}
sentinel = object()
first_key = next(iter(my_dict), sentinel)
if first_key is sentinel:
    print("No keys")
else:
    print(first_key)

使用 list(my_dict)[0] 的列表方法没有默认参数,当没有键时会引发 IndexError。当内联的替代值使空输入行为更易于处理时,请使用 next(iter(my_dict), default)。