递归地在python中设置的所有子集(Nonetype错误)

时间:2015-11-12 01:28:03

标签: python recursion subset nonetype

我试图以递归方式从集合中获取所有子集,这是我到目前为止的代码:

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)

1 个答案:

答案 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)