Python 具有O(1)随机移除和添加的数据结构,用于洗牌生成器顺序

Python 具有O(1)随机移除和添加的数据结构,用于洗牌生成器顺序,python,python-3.x,algorithm,data-structures,Python,Python 3.x,Algorithm,Data Structures,我需要一个数据结构,允许您在O(1)时间内随机添加和删除元素 其原因是我需要从生成器中洗牌数据,但由于大小原因,我无法同时将所有数据加载到内存中 这是一个用法示例,它自动洗牌生成器表达式生成的结果的顺序,而无需将所有内容加载到内存中: def generator_shuffler(generator) a = magical_data_structure_described_above for i in generator: a.add(i) if

我需要一个数据结构,允许您在
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()

最初我尝试了python
set()
,但是从这里开始:,似乎
set()
实际上并没有按任意顺序删除项目。如何使用上述用法实现数据结构?

如果您想随机弹出,为什么不使用列表,通过将最后一个元素与随机选择的元素交换,然后删除新的最后一个元素来实现弹出?这不会保留数据结构中其余元素的顺序,但“随机弹出”和“随机移动”表明您并不在意。

如果您想随机弹出,为什么不使用列表并通过将最后一个元素与随机选择的元素交换,然后删除新的最后一个元素来实现弹出?这不会保留数据结构中剩余元素的顺序,但“随机弹出”和“随机移动”表明您并不在意。

在集合中查找和删除随机元素通常是在使用
pop
时进行的,但是,您可以修改操作,以便在检查长度时对列表进行随机移动,这样,
add
pop
操作仍然是
O(1)

输出:

2
4
9
0
6
12

查找和删除集合中的随机元素通常是在使用
pop
时进行的,但是,您可以修改操作,以便在检查长度时对列表进行无序排列,这样,添加
pop
操作都会保留
O(1)

输出:

2
4
9
0
6
12