python - 子集的确切数量

标签 python

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

这是我获取具有 m 元素的所有子集的函数:

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

最佳答案

如果你想随机获取它们,可以使用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

关于python - 子集的确切数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36615405/

相关文章:

python - 如何忽略所有 java.io 异常?

具有奇怪输出错误的 Python 线程

python - django 模板中 "none"的等价物是什么?

Python如何检查目标对象是否不再是同一个实例或 "valid"

python - 关于 C 溢出,如何在 Python 中使用 64 位无符号整数数学?

python - 在基于 Intel 的 64 位 Mac(Perl/Python 用户)上安装 MySQL 32 位或 64 位更好吗?

c# - 为什么我们不需要动态语言的接口(interface)?

python - 如何在 Pandas 数据框中用中值替换异常值?

python - 在 tf.train.AdamOptimizer 中手动更改 learning_rate

python - 如何使用 Python 创建 JKS 或 P12 keystore