Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何有效地随机抽样大小为r的k个组合形成一个列表?_Python_Itertools - Fatal编程技术网

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,我认为这不会太高效。您可能会随机选择
。采样
索引,然后在不创建实际列表的情况下循环组合,并选择与索引匹配的元素。