我试图以递归方式从集合中获取所有子集,这是我到目前为止的代码:
aset = [1,2,10,4,5,99]
def subSets(aset):
if len(aset) == 0:
return []
prevSets = subSets(aset[:len(aset)-1])
newSets =[]
print prevSets
for s in prevSets:
newSets.append(s.append(aset[-1]))
return prevSets.extend(newSets)
print subSets(aset)
通过这个python实现,我收到以下错误,我似乎无法理解为什么:
File "9_4.py", line 9, in subSets
for s in prevSets:
TypeError: 'NoneType' object is not iterable
似乎None
已进入prevSet
,但我无法弄清楚为什么,任何想法?
编辑 - 正确的解决方案:
感谢Martijn Pieters,我确切地知道出了什么问题,最终我试图实现以下目标:
def subSets(aset):
if len(aset) == 0:
return [[]]
prevSets = subSets(aset[:-1])
newSets =[]
for s in prevSets:
another = s + [aset[-1]]
newSets.append(another)
return prevSets + newSets
print subSets(aset)
答案 0 :(得分:4)
prevSets
此处设置为None
:
prevSets = subSets(aset[:len(aset)-1])
因为以下行生成None
:
return prevSets.extend(newSets)
list.extend()
改变列表就地并返回None
。分开呼叫并返回:
prevSets.extend(newSets)
return prevSets
或改为使用连接:
return prevSets + newSets
请注意,您在其他地方犯了类似的错误:
for s in prevSets:
newSets.append(s.append(aset[-1]))
list.append()
也会返回None
,因此您实际上将None
添加到newSets
。我不确定你想要在那里追加什么;如果您想在将s
添加到newSets
之后将aset[-1]
添加到s
,请在不同的行中执行此操作:
for s in prevSets:
s.append(aset[-1])
newSets.append(s)