作者cuteSquirrel (可爱的小松鼠)
看板Python
标题Re: [问题] 列出一个列表中所有子集合
时间Fri Dec 2 19:54:08 2022
针对每个号码
只有两种可能
拿 或 不拿
从这个思考逻辑,透过递回去实现
https://onlinegdb.com/Tcl3snoKh
def subsets( nums ) :
all_subset = []
bag = []
# ----------------------------------------
# i : 索引值, 从 0 ~ n-1
def picker( i ):
## 终止条件
# 当所有号码都已经考虑过了
if i == len(nums):
all_subset.append( bag[::] )
return
## 递回关系式:
# 对当下这个号码,有两种可能情况,拿这个号码,或者不拿这个号码。
# 可能情况a: 拿当下这个号码
bag.append( nums[i] )
picker( i+1 )
bag.pop()
# 可能情况b: 不拿当下这个号码
picker( i+1 )
return
# -----------------------------------------
# 从第一个号码开始
picker( 0 )
return all_subset
# 范例:假定输入是[1, 2, 3]
numbers = [1,2,3]
result = subsets( numbers )
# 范例输出: [[1, 2, 3], [1, 2], [1, 3], [1], [2, 3], [2], [3], []]
print( result )
======================================================================
※ 引述《rebe212296 (绿豆冰)》之铭言:
请问list的子集合如何求出,我想做的是投入一列表可以return其子集的函式
nums=[1,2,3]
#这是想要的结果 [[],[1],[2],[3],[1,2],[1,3],[2,3],[1,2,3]]
#想法:每抽出1,2,3,几个元素,便存成一个list
def NS(list):
S=[]
j=len(list)
for i in list:
S.append([i])
while(j>=0):
S.append(list[:j])
S.append(list[j:])
j-=1
return S
print(NS(nums))
#这个结果是
[[1], [2], [3], [1, 2, 3], [], [1, 2], [3], [1], [2, 3], [], [1, 2, 3]]
可是我求不出[1, 3],先谢谢版大的回答。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.37.1 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1669450199.A.FDA.html
1F:→ lycantrope: 原始code是把list从头到尾切两边再append,并不是组合 11/26 16:55
2F:→ lycantrope: 可以查一下itertools.combinations 11/26 16:56
3F:→ genius091612: leetcode 78. Subsets 就是你要的 11/26 18:00
4F:→ mantour: 想一下树状图:第一层是“1”要放或不放,第二层是”2” 12/02 07:36
5F:→ mantour: 要放或不放,... 12/02 07:36
6F:→ mantour: 或是想成2进位的000到111,000对应[ ],111对应[1,2, 12/02 07:38
7F:→ mantour: 3] 12/02 07:38
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.37.167.185 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1669982051.A.E45.html