eLe*_*ner 5 python combinations shuffle python-itertools
以下简单代码为我提供了200个元素的长度3的可能组合。
from itertools import combinations
comb = combinations( range(200), 3 )
Run Code Online (Sandbox Code Playgroud)
我想以随机顺序获取组合,以便选择前N个组合。但是,如果我将梳子转换为一个列表并按如下所示对其进行混洗,则可能会出现内存错误,因为该列表可能包含太多元素:
comb = list(comb) # This might be huge and give a memory error
random.shuffle(comb)
N = 10
comb = comb[:10] # get only the first N random combinations
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以获取N个随机组合吗?(即,不是按照itertools.combinations生成的顺序)。
有C(200, 3) = 1313400可能的组合。正如您还提到的那样,由于组合爆炸,该数字很容易失控。例如,如果选择4个而不是3个元素,则组合的数量将大约大50倍(64684950)。您可以随机构建可能的组合,而不是从这些组合中随机选择。
要构建这些组合,可以使用随机库中的random.sample。random.sample(range(200), 3)将随机生成这1313400个组合之一。如果再次调用,它将生成另一个组合。
有两个问题:
random.sample([1、2、3]与[1、3、2]不同)。在组合中,不是。要解决此问题,您可以使用sorted()。random.sample将独立生成接下来的3个数字。因此,在不同迭代中生成的组合可能是相同的。尽管此示例不太可能(?0.0000343),但您可以使用集合存储组合,以便仅存储唯一的组合。以下将生成10个不同的组合:
import random
combs = set()
N = 10
while len(combs) < N:
combs.add(tuple(sorted(random.sample(range(200), 3))))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2117 次 |
| 最近记录: |