如何获得集合的所有子集?(Powerset)

如何获得集合的所有子集?(Powerset)

给定一组

{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}]


青春有我
浏览 1475回答 3
3回答

四季花海

Pythonitertools页有一个powerset这方面的配方:from itertools import chain, combinationsdef powerset(iterable):     "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"     s = list(iterable)     return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))产出:>>> list(powerset("abcd"))[(), ('a',), ('b',), ('c',), ('d',), ('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd'),  ('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd'), ('a', 'b', 'c', 'd')]如果您不喜欢开头的空元组,只需更改range向range(1, len(s)+1)以避免0长度的组合。

子衿沉夜

下面是Powerset的更多代码。这是从头开始写的:>>> def powerset(s):...&nbsp; &nbsp; &nbsp;x = len(s)...&nbsp; &nbsp; &nbsp;for i in range(1 << x):...&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;print [s[j] for j in range(x) if (i & (1 << j))]...>>> powerset([4,5,6])[][4][5][4, 5][6][4, 6][5, 6][4, 5, 6]马克·拉沙科夫的评论适用于这里:“如果你不喜欢开头那个空的元组,就可以把Range语句更改为range(1,len(S)+1),以避免0长度的组合”,除非在我的例子中更改。for i in range(1 << x)到for i in range(1, 1 << x).几年后回到这里,我现在写成这样:def powerset(s):&nbsp; &nbsp; x = len(s)&nbsp; &nbsp; masks = [1 << i for i in range(x)]&nbsp; &nbsp; for i in range(1 << x):&nbsp; &nbsp; &nbsp; &nbsp; yield [ss for mask, ss in zip(masks, s) if i & mask]然后测试代码将如下所示:print(list(powerset([4, 5, 6])))使用yield意味着不需要计算单个内存中的所有结果。在主循环外重新计算掩码被认为是一个有价值的优化。

蝴蝶不菲

如果您正在寻找一个快速的答案,我刚刚在Google上搜索了“pythonpowerset”,并得到了如下结果:Python功率集生成器下面是页面中代码的复制粘贴:def&nbsp;powerset(seq): &nbsp;&nbsp;&nbsp;&nbsp;""" &nbsp;&nbsp;&nbsp;&nbsp;Returns&nbsp;all&nbsp;the&nbsp;subsets&nbsp;of&nbsp;this&nbsp;set.&nbsp;This&nbsp;is&nbsp;a&nbsp;generator. &nbsp;&nbsp;&nbsp;&nbsp;""" &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;len(seq)&nbsp;<=&nbsp;1: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;seq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;else: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;item&nbsp;in&nbsp;powerset(seq[1:]): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;[seq[0]]+item&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yield&nbsp;item它可以这样使用:&nbsp;l&nbsp;=&nbsp;[1,&nbsp;2,&nbsp;3,&nbsp;4] &nbsp;r&nbsp;=&nbsp;[x&nbsp;for&nbsp;x&nbsp;in&nbsp;powerset(l)]现在r是您想要的所有元素的列表,可以排序和打印:r.sort()print&nbsp;r[[],&nbsp;[1],&nbsp;[1,&nbsp;2],&nbsp;[1,&nbsp;2,&nbsp;3],&nbsp;[1,&nbsp;2,&nbsp;3,&nbsp;4],&nbsp;[1,&nbsp;2,&nbsp;4],&nbsp;[1,&nbsp;3],&nbsp;[1,&nbsp;3,&nbsp;4],&nbsp;[1,&nbsp;4],&nbsp;[2],&nbsp;[2,&nbsp;3],&nbsp;[2,&nbsp;3,&nbsp;4],&nbsp;[2,&nbsp;4], &nbsp;[3],&nbsp;[3,&nbsp;4],&nbsp;[4]]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python