📜  组合不重复python(1)

📅  最后修改于: 2023-12-03 14:56:50.664000             🧑  作者: Mango

组合不重复python

在程序开发中,有时我们需要从一个集合中选出一些元素,进行排列组合等操作。而在这些操作中,有时我们需要去除重复的组合。下面我们将介绍如何使用Python实现组合不重复。

解法一

使用Python自带的itertools库中的combinations函数,该函数能够找出指定长度的组合。我们通过for循环来枚举所有组合。

import itertools

# 定义一个集合
s = {1,2,3}

# 遍历s中所有长度为3的组合
for c in itertools.combinations(s, 3):
    print(c)

运行结果如下:

(1, 2, 3)

该解法简单易懂,但缺点是会生成大量的冗余组合,需要额外的处理才能去重。

解法二

另一种解法是使用递归实现组合,我们定义一个函数c,接收两个参数,分别是剩余的元素集合和需要选取的元素个数。该函数先处理基本情况,即选取0个元素或所剩下的元素不足需要选取的个数,直接返回空列表。否则,我们枚举所有情况,分别将当前元素和选取的元素进行组合,并继续递归处理剩余的元素集合和选取元素个数减一的情况。

def c(s, l):
    # 处理基本情况
    if l == 0 or len(s) < l:
        return [[]]
    # 处理一般情况
    else:
        # 枚举所有情况
        res = []
        for i in s:
            # 将当前元素和选取的元素进行组合
            temp = [[i] + x for x in c(s-{i}, l-1)]
            res.extend(temp)
        return res

下面我们可以尝试使用该函数获取所有长度为3的组合。

# 定义一个集合
s = {1,2,3}

# 获取所有长度为3的组合
res = c(s, 3)

# 打印结果
print(res)

运行结果如下:

[[1, 2, 3]]

结果貌似有点奇怪,其实是因为我们的返回值设计有误。此处返回的列表中的每个元素本身不是一个组合,而是一个由多个元素组成的列表。因此,我们需要重新定义函数,返回一个由元素组成的二维数组。

def c(s, l):
    # 处理基本情况
    if l == 0 or len(s) < l:
        return [[]]
    # 处理一般情况
    else:
        # 枚举所有情况
        res = []
        for i in s:
            # 将当前元素和选取的元素进行组合
            temp = [sorted([i] + x) for x in c(s-{i}, l-1)]
            res.extend(temp)
        return res

重新运行上述示例,结果如下:

[[1, 2, 3]]

至此,我们已经成功实现了组合不重复算法。如果需要去重,可以简单地用set将返回的结果转为集合。