python 中集合的所有子集递归(无类型错误)

All subsets from a set in python recursively (Nonetype error)

我正在尝试递归地从集合中获取所有子集,这是我目前拥有的代码:

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)

prevSets这里设置为None

prevSets = subSets(aset[:len(aset)-1])

因为下一行产生 None:

return prevSets.extend(newSets)

list.extend() 改变列表 就地 和 returns None。分开调用和return:

prevSets.extend(newSets)
return prevSets

或改用连接:

return prevSets + newSets

请注意,您在其他地方犯了类似的错误:

for s in prevSets:
    newSets.append(s.append(aset[-1]))

list.append() 也 returns None,所以你实质上是将 None 添加到 newSets。我不确定您想在那里添加什么;如果您想在将 aset[-1] 添加到 s 之后将 s 添加到 newSets,请在单独的行中执行此操作:

for s in prevSets:
    s.append(aset[-1])
    newSets.append(s)