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)
我正在尝试递归地从集合中获取所有子集,这是我目前拥有的代码:
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)