给定一个集合
{0, 1, 2, 3}
如何生成子集:
[set(),
{0},
{1},
{2},
{3},
{0, 1},
{0, 2},
{0, 3},
{1, 2},
{1, 3},
{2, 3},
{0, 1, 2},
{0, 1, 3},
{0, 2, 3},
{1, 2, 3},
{0, 1, 2, 3}]
给定一个集合
{0, 1, 2, 3}
如何生成子集:
[set(),
{0},
{1},
{2},
{3},
{0, 1},
{0, 2},
{0, 3},
{1, 2},
{1, 3},
{2, 3},
{0, 1, 2},
{0, 1, 3},
{0, 2, 3},
{1, 2, 3},
{0, 1, 2, 3}]
def power_set(lst):
pw_set = [[]]
for i in range(0,len(lst)):
for j in range(0,len(pw_set)):
ele = pw_set[j].copy()
ele = ele + [lst[i]]
pw_set = pw_set + [ele]
return pw_set
使用空集,它是所有子集的一部分,可以使用以下内容:
def subsets(iterable):
for n in range(len(iterable) + 1):
yield from combinations(iterable, n)
我只想提供最易懂的解决方案,即反代码高尔夫版本。
from itertools import combinations
l = ["x", "y", "z", ]
def powerset(items):
combo = []
for r in range(len(items) + 1):
#use a list to coerce a actual list from the combinations generator
combo.append(list(combinations(items,r)))
return combo
l_powerset = powerset(l)
for i, item in enumerate(l_powerset):
print "All sets of length ", i
print item
结果
所有长度为0的集合
[()]
所有长度为1的集合
[('x',), ('y',), ('z',)]
所有长度为2的集合
[('x', 'y'), ('x', 'z'), ('y', 'z')]
所有长度为3的集合
[('x', 'y', 'z')]
有关更多信息,请参见itertools文档,以及维基百科词条幂集
from itertools import combinations
def subsets(arr: set) -> list:
subsets = []
[subsets.extend(list(combinations(arr,n))) for n in range(len(arr))]
return subsets
a = {1,2,3}
print(subsets(a))
输出:
[(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3)]
# sorted subsets
print(sorted(subsets(a)))
输出:
[(), (1,), (1, 2), (1, 3), (2,), (2, 3), (3,)]
def powerSet(s):
sets = [[]]
for i in s:
newsets = []
for k in sets:
newsets.append(k+[i])
sets += newsets
return sets
对于那些想要简单回答的人,首先编写代码。我在这里有一个好的解释:https://leetcode.com/problems/subsets/solutions/3138042/simple-python-solution/
但简短的答案是,你从空集合开始,即“sets = [[]]”。我建议在“for i in s”下面放置一个打印语句,即“print(sets)”,看到它在每个元素i中都会增加一倍。
快速复习一下幂集!
一个集合X的幂集,就是包含X所有子集(包括空集)的集合。
例如,令X = (a,b,c)
幂集= { { a , b , c } , { a , b } , { a , c } , { b , c } , { a } , { b } , { c } , { } }
以下是另一种找到幂集的方法:
def power_set(input):
# returns a list of all subsets of the list a
if (len(input) == 0):
return [[]]
else:
main_subset = [ ]
for small_subset in power_set(input[1:]):
main_subset += [small_subset]
main_subset += [[input[0]] + small_subset]
return main_subset
print(power_set([0,1,2,3]))
感谢原作者的贡献
from itertools import combinations
someSet = {0, 1, 2, 3}
([x for i in range(len(someSet)+1) for x in combinations(someSet,i)])
def powerset(x):
m=[]
if not x:
m.append(x)
else:
A = x[0]
B = x[1:]
for z in powerset(B):
m.append(z)
r = [A] + z
m.append(r)
return m
print(powerset([1, 2, 3, 4]))
输出:
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3], [4], [1, 4], [2, 4], [1, 2, 4], [3, 4], [1, 3, 4], [2, 3, 4], [1, 2, 3, 4]]
使用递归获取所有子集。疯狂的一行代码。
from typing import List
def subsets(xs: list) -> List[list]:
return subsets(xs[1:]) + [x + [xs[0]] for x in subsets(xs[1:])] if xs else [[]]
subsets :: [a] -> [[a]]
subsets [] = [[]]
subsets (x:xs) = map (x:) (subsets xs) ++ subsets xs
NameError: name 'List' is not defined
- 4LegsDrivenCatList
导入。 - Paweł Rubindef findsubsets(s, n):
return list(itertools.combinations(s, n))
def allsubsets(s) :
a = []
for x in range(1,len(s)+1):
a.append(map(set,findsubsets(s,x)))
return a