Python中dict.keys()的时间复杂度是多少?

Python中dict.keys()的时间复杂度是多少?,python,Python,我解决问题时遇到了一个问题。虽然我的解决方案被系统接受,但在网上搜索以下问题后,我仍然没有任何想法: dict.keys()操作的时间复杂度是多少? 它返回键的视图还是键的真实列表(存储在内存中)?在Python 2中,它是O(n),并构建一个新列表。在Python3中,它是O(1),但不返回列表。要从dict的键中提取随机元素,需要将其转换为列表 听起来您可能使用了random.choice(d.keys())来解决问题的第3部分。如果是这样,那就是O(n),而你错了。您需要实现自己的哈希表或

我解决问题时遇到了一个问题。虽然我的解决方案被系统接受,但在网上搜索以下问题后,我仍然没有任何想法:

dict.keys()操作的时间复杂度是多少?

它返回键的视图还是键的真实列表(存储在内存中)?

在Python 2中,它是O(n),并构建一个新列表。在Python3中,它是O(1),但不返回列表。要从dict的
中提取随机元素,需要将其转换为列表


听起来您可能使用了
random.choice(d.keys())
来解决问题的第3部分。如果是这样,那就是O(n),而你错了。您需要实现自己的哈希表或维护单独的元素列表,而不牺牲插入和删除的平均大小写。

在Python3.x中,它的复杂性是
0(1)
。在Python2.x中,它返回一个列表,因此填充它或对它执行一些查找需要
0(n)
。您是在询问Python2还是Python3?@Robᵩ 没错,但我认为OP是在询问调用
.keys()
的成本,而不是反复询问。是的。正如@ozgur所指出的,仅仅调用
dict.keys()
而不对结果进行任何处理,在Python2中是
O(n)
,在Python3中是
O(1)
。@ozgur Yep。我问的是调用.keys()的成本,而不是重复调用。我使用了
返回self.elements.keys()[randint(0,len(self.elements)-1)]
,它被接受了(
self.elements是一个dict对象
)。正如您所说的“在Python 3中,它是O(1)”。如果
self.elements.keys()
O(1)
,那么整个表达式将在
O(1)
中运行。如果我犯了错误,请纠正我:)@Jason:
dict.keys()
的设置与Python 3类似;如果不将其转换为列表、元组或其他内容,就无法从中提取随机元素。@Jason:“索引操作……如何工作”-它不工作。在Python3上,您会得到一个TypeError。@Jason,在Python3中,您会得到
TypeError:“dict\u keys”对象不支持索引