我想检查属性的极长(超过十亿个元素)生成器的元素。显然,检查所有元素(大约需要400年)是不可行的。目前,它们以有序的方式生产。为了让我有时间检查的小样本更能代表整个事物,我想随机访问生成器。
有没有办法做到这一点(将其更改为list
并且无法执行random.shuffle
)?
我正在尝试从大输入集的itertools.combinations
结果中选择一个随机样本:
itertools.combinations(a_large_set, 3)
答案 0 :(得分:1)
有没有办法做到这一点
没有
答案 1 :(得分:1)
您无法在生成器中跳过。有一些方法可以迭代并创建有效的随机样本,但是您必须对要迭代的元素数量设置上限。然后,它不代表生成器可以生成的所有可能值的有效随机选择。
如果要从大型列表中生成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)