我想知道Python内置set结构的元素排序是否"足够随机".例如,取一个集合的迭代器,它可以被视为其元素的混乱视图吗?
(如果重要的话,我在Windows主机上运行Python 2.6.5.)
输入random.choice应该是一个序列。这会导致 a 出现奇怪的行为dict,它不是序列类型,但可以像下面这样使用下标:
>>> d = {0: 'spam', 1: 'eggs', 3: 'potato'}
>>> random.choice(d)
'spam'
>>> random.choice(d)
'eggs'
>>> random.choice(d)
'spam'
>>> random.choice(d)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/random.py", line 274, in choice
return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty
KeyError: 2
Run Code Online (Sandbox Code Playgroud)
此外,random.choice它根本不适用于set和collections模块中的其他一些容器。
有充分的理由吗random.choice(d)不应该以明显的方式工作,返回随机密钥?
我考虑过random.choice(list(d)),random.sample(d, 1)[0]但希望有更有效的方法。可以random.choice在不降低序列当前行为的情况下进行改进吗?
我需要一个数据结构,允许您添加元素并O(1)及时随机删除它们.
这样做的原因是我需要从生成器中移植数据,但由于大小的原因,我无法同时将所有内容加载到内存中.
这是一个使用示例,它自动混合生成器表达式生成的结果的顺序,而不将所有内容加载到内存中:
def generator_shuffler(generator)
a = magical_data_structure_described_above
for i in generator:
a.add(i)
if len(a) > 10: yield a.poprandom()
Run Code Online (Sandbox Code Playgroud)
最初我尝试了一个python set(),但是从这里开始:Set.pop()不是随机的?,似乎set()实际上并没有以任意顺序删除项目.如何使用上述用法实现数据结构?