我需要使用基本给定集的n
元素生成k
个子集。我知道如何生成所有子集,但是如何才能生成d
个子集?
以下是获取m
个元素的所有子集的功能:
def find(S,m):
return set(itertools.combinations(S, m))
答案 0 :(得分:1)
您可以从所有组合的生成器中切割必需数量的项目。
import itertools
def find(S, m, d):
"""Returns at most d subsets of S, each of size m."""
return list(itertools.islice(itertools.combinations(S, m), d))
print find('ABCD', 2, 4)
输出:
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C')]
答案 1 :(得分:1)
可能你可以这样做:
a = itertools.combinations([1,2,3,4,5],2)
count = 3
for x in a:
if count > 0 :
print x
count = count - 1
答案 2 :(得分:1)
如果您想随机获取它们,可以使用random.sample:
import random
def find(S, m, d):
return random.sample(list(itertools.combinations(S, m)), d)
如果您打算定期调用该函数,则上述代码效率非常低。对于固定的S和变量m,您可以先构建一个字典:
S = "ABCDE"
fixed_dict = {m: list(itertools.combinations(S,m)) for m in range(len(S)+1)}
def find2(m, d):
return random.sample(fixed_dict[m], d)
一种更有效的方法,在需要时为不同的S和m填充字典:
comb_dict = {}
def find3(S, m, d):
try:
return random.sample(comb_dict[(S,m)], d)
except KeyError:
comb_dict[(S, m)] = list(itertools.combinations(S, m))
return random.sample(comb_dict[(S,m)], d)
对于较不规则的较大样本,散列不会有太大帮助,您也可以尝试:
def find4(S, m, d):
combs = set()
while len(combs) < d:
combs.add(tuple(sorted(random.sample(S, m))))
return combs