我希望它接受一组数字作为输入,例如[1,2,3,4],并且只给出奇数和的子集。例如,[1],[1,2],[2,3]等。
我没有尝试太多,我不知道从哪里开始。抱歉,我对编程很陌生,但这是我到目前为止所拥有的。它会生成所有可能的子集。
def rsubsets(s):
if len(s) == 0:
return [[]]
temp = rsubsets(s[1:])
new = []
for itm in temp:
new.append(itm)
n = len(new)
for j in range(n):
new[j] = new[j] + [s[0]]
return temp + new
谢谢。
基于现有函数构建:
def odd_subsets(s):
return [x for x in rsubsets(s) if sum(s) % 2 == 1]
或者没有理解:
def odd_subsets(s):
odd = []
for subset in rsubsets(s):
if sum(s) % 2 == 1:
odd.append(subset)
return odd
def odd_subsets(s):
lRet = []
for i in range(len(s)):
lRet.extend([c for c in itertools.combinations(s,i+1) if sum(c)%2==1])
return lRet
如果你死心塌地地使用你的初始函数,这是最简单的方法。
def rsubsets(s):
def all_subsets(s):
if len(s) == 0:
return [[]]
temp = all_subsets(s[1:])
new = []
for itm in temp:
new.append(itm)
n = len(new)
for j in range(n):
new[j] = new[j] + [s[0]]
return temp + new
return [i for i in all_subsets(s) if sum(i)%2==1]
这几乎是调用您的初始递归函数并过滤结果。
另一种方法是使用标志...
def rsubsets(s,bFilter=True):
if len(s) == 0:
return [[]]
temp = rsubsets(s[1:],False)
new = []
for itm in temp:
new.append(itm)
n = len(new)
for j in range(n):
new[j] = new[j] + [s[0]]
if bFilter:
return [i for i in temp+new if sum(i)%2 ==1]
return temp + new