随机生成器
Randomize a generator
我想检查 属性 的极长(超过十亿个元素)生成器的元素。显然,检查所有元素是不可行的(大约需要 400 年)。目前,它们以有序的方式生产。为了让我有时间检查的小样本更能代表整个事情,我想随机访问生成器。
有什么方法可以做到这一点(因为将其更改为 list
并且无法执行 random.shuffle
)?
我正在尝试从大型输入集的 itertools.combinations
结果中选择一个随机样本:
itertools.combinations(a_large_set, 3)
Is there any way to do this
没有
您不能在生成器中向前跳转。有多种方法可以迭代和创建有效的随机样本,但您必须对要迭代的元素数量设置上限。那么它就不会代表生成器可以产生的所有可能值中的有效随机选择。
如果您要从一个大列表中生成 3 个元素的组合,则只需选择 3 个样本:
def random_combinations_sample(lst, element_count, sample_size):
result = set()
while len(result) < sample_size:
indices = random.sample(xrange(len(lst)), element_count)
sample = tuple(lst[i] for i in sorted(indices))
result.add(sample)
return list(result)
如果您只需要一组随机组合,则无需生成所有可能的 组合。与 itertools.combinations()
一样,元素是按照它们在输入列表中出现的顺序选取的。
而不是:
random.sample(itertools.combinations(a_large_set, 3), 10)
你会用
random_combinations_sample(a_large_set, 3, 10)
我想检查 属性 的极长(超过十亿个元素)生成器的元素。显然,检查所有元素是不可行的(大约需要 400 年)。目前,它们以有序的方式生产。为了让我有时间检查的小样本更能代表整个事情,我想随机访问生成器。
有什么方法可以做到这一点(因为将其更改为 list
并且无法执行 random.shuffle
)?
我正在尝试从大型输入集的 itertools.combinations
结果中选择一个随机样本:
itertools.combinations(a_large_set, 3)
Is there any way to do this
没有
您不能在生成器中向前跳转。有多种方法可以迭代和创建有效的随机样本,但您必须对要迭代的元素数量设置上限。那么它就不会代表生成器可以产生的所有可能值中的有效随机选择。
如果您要从一个大列表中生成 3 个元素的组合,则只需选择 3 个样本:
def random_combinations_sample(lst, element_count, sample_size):
result = set()
while len(result) < sample_size:
indices = random.sample(xrange(len(lst)), element_count)
sample = tuple(lst[i] for i in sorted(indices))
result.add(sample)
return list(result)
如果您只需要一组随机组合,则无需生成所有可能的 组合。与 itertools.combinations()
一样,元素是按照它们在输入列表中出现的顺序选取的。
而不是:
random.sample(itertools.combinations(a_large_set, 3), 10)
你会用
random_combinations_sample(a_large_set, 3, 10)