【python】求幂集

此处只关注可数集的幂集。幂集即所有子集构成的集合,包含空集和原集合。

幂集个数:一个含有n个元素的集合,其幂集包含2^n个集合。

一、函数式编程求幂集

reduce():曾经是内建函数,现在要从functools库中引用。函数参数:function、iterable、initializer(可选参数)。function把两个值缩减为一个值,比如通过lambda表达式相加。

from functools import reduce
s={1,2,3}
ps=lambda s:reduce(lambda P,x:P+[subset|{x}for subset in P],s,[set()])
print(ps(s))
#输出结果:[set(),{1},{2},{1,2},{3},{1,3},{2,3},{1,2,3}]

二、递归式求幂集

这里是用列表模拟的集合。先求出{1,2}的子集再再后面加3。

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        ans = [[]]
        for i in nums:
            l = len(ans)
            for j in range(l):
                t = []
                t.extend(ans[j])
                t.append(i)
                ans.append(t)
        return ans

三、位表示求幂集

[1,2,3]有三个元素。取则视为1,不取视为2。取完要去重。

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        ans = []
        n = 1<>= 1
                idx += 1
            ans.append(res)
        return ans

#去重
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        if len(nums) == 0:
            return [[]]
        
        def back(chose, cur):
            res.append(cur)
            if not chose:
                return
            for i in range(len(chose)):
                back(chose[i+1:], cur+[chose[i]])
            
        res = []
        back(nums,[])
        return res

你可能感兴趣的:(python,python)