从字典中获取单个键的最佳方法?

新手上路,请多包涵

拥有一个 python 字典并且知道它仅由一个键/值对组成,检索单个/唯一项的最佳方法是什么?

到目前为止,我知道我可以使用以下两种方式之一:

  1. list(mydict.keys())[0]

  2. next(iter(mydict))

据我所知, list 性能比 iter 差,所以后一种方法应该更好,对吧?哪些方式最好?有比我指出的两种方式更好的东西吗?请告诉我。

原文由 danicotra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 388
2 个回答

哪种方式最好?

我建议使用 next(iter(d)) 而不是 list(mydict.keys())[0] 从字典中检索键。如您所料,使用 next(iter(d)) 在效率方面 好得多。

可以通过计时每种方法来观察效率差异:

 >>> import timeit
>>> setup='from string import ascii_letters; d = {k: v for k, v in enumerate(ascii_letters)}'
>>> timeit.timeit(stmt='list(d.keys())[0]', setup=setup)
1.0895291733333334
>>> timeit.timeit(stmt='next(iter(d))', setup=setup)
0.2682935466666656

随着字典大小的增加,使用 next(iter(d)) 而不是 list(d.keys())[0] 的选择变得非常 非常 明显:

 >>> setup='d = {k: v for k, v in enumerate(range(500, 10000))}'
>>> timeit.timeit(stmt='list(d.keys())[0]', setup=setup)
98.52252842666667
>>> timeit.timeit(stmt='next(iter(d))', setup=setup)
0.2720192000000452

next(iter(d))list(d.keys())[0] 执行得好得多,主要是因为它避免了在内存中创建所有字典键的潜在巨大列表,而实际上它只需要第一个元素。

原文由 Christian Dean 发布,翻译遵循 CC BY-SA 3.0 许可协议

由于问题假设字典只有一个键值对,所以除了 接受的答案 之外,我想再添加两种方法。

  • 使用 dict.popitem()[0]popitem() 返回元组中唯一的键值对:(key, value)。如果不想改变原始字典,请先复制一份。
  • 构建一组然后弹出: set(mydict).pop()

Python 3.9.6 中的简单性能比较:

 In [11]: import timeit

In [12]: timeit.timeit(stmt='d={1:2}; d.popitem()[0]')
Out[12]: 0.15144950605463237

In [13]: timeit.timeit(stmt='d={1:2}; next(iter(d))')
Out[13]: 0.1860927080269903

In [14]: timeit.timeit(stmt='d={1:2}; set(d).pop()')
Out[14]: 0.19704585697036237

In [15]: timeit.timeit(stmt='d={1:2}; list(d)[0]')
Out[15]: 0.2412048210389912

原文由 alick 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题