如果你有一个Python字典,并且知道它只包含一个键/值对,那么检索该单个唯一项的最佳方法是什么?
到目前为止,我知道我可以使用以下两种方式之一:
list(mydict.keys())[0]
next(iter(mydict))
据我所知,list
的性能比 iter
差,因此后一种方法应该更好,对吗?哪种方法更好?是否有比我提到的这两种方法更好的方法?请告诉我。
如果你有一个Python字典,并且知道它只包含一个键/值对,那么检索该单个唯一项的最佳方法是什么?
到目前为止,我知道我可以使用以下两种方式之一:
list(mydict.keys())[0]
next(iter(mydict))
据我所知,list
的性能比 iter
差,因此后一种方法应该更好,对吗?哪种方法更好?是否有比我提到的这两种方法更好的方法?请告诉我。
哪种方法最好?
我建议使用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]
好得多,主要是因为它避免了在内存中创建所有字典键的潜在巨大列表,当它只需要第一个元素时。
next(iter(d))
比list(d.keys())[0]
更好;这也是最好的方法吗? - danicotranext(iter(d))
不会创建的巨大不必要列表的部分也很好,但是关于“使用更少的指令,因此更有效”的部分是无效的推断。我建议只删除反汇编和从中得出的结论。 - user2357112next(iter())
获取单个值是否也可以,而不是使用[*dict.values()][0]]
? - Bilal由于问题假设字典只有一个键值对,除了接受的答案,我想再添加两种方法。
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
OrderedDict
:
from collections import OrderedDict
d = OrderedDict()
#add items as normal
first_key = [a for a, b in d.items()][0]
print(d[first_key])
for
循环进行迭代是一种常见的方法。你可以使用for key, value in mydict.items():
。 - cdarke