Python 如何有效地随机抽样大小为r的k个组合形成一个列表?
您可以使用Python 如何有效地随机抽样大小为r的k个组合形成一个列表?,python,itertools,Python,Itertools,您可以使用itertools.combinations轻松生成列表元素的所有可能组合。我感兴趣的是尽可能有效地对其中的一小部分进行采样。在某些情况下,这将意味着有数百万个组合,只需要随机选择少数组合 import itertools combinations = itertools.combinations(range(1, 30), 10) 我想从存储在组合中的所有组合中抽取4个组合作为样本 编辑:可以找到以前的结果,但我觉得不是很有效。每次从列表中选取10个样本将是最有效的方法 >
itertools.combinations
轻松生成列表元素的所有可能组合。我感兴趣的是尽可能有效地对其中的一小部分进行采样。在某些情况下,这将意味着有数百万个组合,只需要随机选择少数组合
import itertools
combinations = itertools.combinations(range(1, 30), 10)
我想从存储在组合中的所有组合中抽取4个组合作为样本
编辑:可以找到以前的结果,但我觉得不是很有效。每次从列表中选取10个样本将是最有效的方法
>>> import random
>>> l = range(1, 30)
>>>
>>> res = [random.sample(l, 10) for _ in range(4)]
>>> pprint(res)
[[23, 25, 27, 9, 8, 19, 3, 16, 26, 7],
[6, 16, 5, 8, 22, 20, 15, 10, 12, 13],
[28, 20, 3, 21, 29, 12, 7, 23, 2, 10],
[18, 13, 29, 23, 19, 10, 27, 7, 17, 20]]
每次从列表中抽取10个样本将是最有效的方法
>>> import random
>>> l = range(1, 30)
>>>
>>> res = [random.sample(l, 10) for _ in range(4)]
>>> pprint(res)
[[23, 25, 27, 9, 8, 19, 3, 16, 26, 7],
[6, 16, 5, 8, 22, 20, 15, 10, 12, 13],
[28, 20, 3, 21, 29, 12, 7, 23, 2, 10],
[18, 13, 29, 23, 19, 10, 27, 7, 17, 20]]
谢谢,重点是名单非常大。我不想将iterable转换为列表,因为这会非常低效。啊,我明白了,您直接生成组合,但这不能保证结果组合的唯一性,对吗?我已经删除了对列表的不必要转换,我现在就得到了。但是,当我们生成一个小样本列表时,我们可以检查新生成的样本是否与已经生成的样本匹配,如果匹配,则重新生成needed@MarkVerhagen听起来是这样。谢谢,重点是名单非常大。我不想将iterable转换为列表,因为这会非常低效。啊,我明白了,您直接生成组合,但这不能保证结果组合的唯一性,对吗?我已经删除了对列表的不必要转换,我现在就得到了。但是,当我们生成一个小样本列表时,我们可以检查新生成的样本是否与已经生成的样本匹配,如果匹配,则重新生成needed@MarkVerhagen听起来像那样。谢谢@Chris,我觉得它没有太高的效率。你可能random.sample
index,然后在不创建实际列表的情况下循环组合,并选择与索引匹配的元素。感谢@Chris,我认为这不会太高效。您可能会随机选择。采样索引,然后在不创建实际列表的情况下循环组合,并选择与索引匹配的元素。