【问题标题】:All subsets from a set in python recursively (Nonetype error)python中递归集合中的所有子集(Nonetype错误)
【发布时间】:2016-02-13 06:38:19
【问题描述】:

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

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)

【问题讨论】:

  • Niggle:这些是列表,而不是集合。
  • @dawg 数学意义上的集合。我将它们实现为列表。
  • 在函数顶部输入print aset。你会看到你的循环永远不会被执行。然后在底部,你有return prevSets.extend(newSets),它返回None

标签: python recursion subset nonetype


【解决方案1】:

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,所以你实质上是在newSets 中添加None。我不确定你想在那里准确地附加什么;如果您想在将aset[-1] 添加到s 之后将s 添加到newSets,请在单独的行中执行此操作:

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

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多