【发布时间】:2015-12-24 12:10:40
【问题描述】:
我知道您可以通过多种方式从字典中选择随机值。
在 Python 2 中:
random.choice(d.keys())
在 Python 3 中:
random.choice(list(d.keys()))
尽管如此,这两种方法都需要在随机选择之前将其转换为一个列表,即线性时间 O(n)。例如,我知道在 Python 3 中 d.keys() 返回一个迭代器,我猜测在 Python 3 中列表是从字典内部创建的。
是否可以在常数时间内从字典中选择一个值,即 O(1)?
编辑:到目前为止,对于 cmets,我认为这是不可能的,至少不是直接的方式。需要辅助结构。
编辑2:我认为字典可以在恒定时间内随机选择,因为它在内部是一个哈希表,即在内部它必须有一个数组或相似的东西。当然,这取决于内部实现,但理论上我认为是可能的。
【问题讨论】:
-
您的用例到底是什么,标准解决方案(调用
dict.keys()并从中选择一个随机值)对您来说性能不够好? -
我正在构建一个计算机模拟,所以我需要多次致电
dict.keys()。我很确定它在 Python 3 中需要 O(n),因为dict.keys()返回一个迭代器。我不认为 Python 2 中的情况会更好,它可能会在内部转换字典。 -
我认为对于您的用例,您最好使用带有增量“值”的预定义“前缀”分配键,即。 "A1", "A2", "B1", "B2"...,那么要随机访问密钥,您只需要从正确的前缀中随机获取,并从 " 的长度中获取 O(1) 的随机值价值”,我认为这是你想要的。
-
@Anzel,问题是字典中不断删除和添加,所以我无法保持一致的键。
-
奇怪的是这个重复的stackoverflow.com/questions/10840901/… 有完全不同的答案。
标签: python dictionary random