确切数量的子集

时间:2016-04-14 06:33:35

标签: python

我需要使用基本给定集的n元素生成k个子集。我知道如何生成所有子集,但是如何才能生成d个子集?

以下是获取m个元素的所有子集的功能:

def find(S,m):
    return set(itertools.combinations(S, m))

3 个答案:

答案 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