为什么这个用于powerset的Python代码不起作用?

时间:2016-01-16 01:02:24

标签: python scala recursion

除了我正在尝试使用Python进行Scala类型操作之外,我无法识别任何明显错误的内容。

def powerset(arr):
        if len(arr) == 0:
            return []
        elif len(arr) > 1:
            return powerset(arr[1:])+[arr[0]]

我一直都会收到错误:

  

return powerset(arr [1:])+ [arr [0]]

     

TypeError:+不支持的操作数类型:'NoneType'和'list'

2 个答案:

答案 0 :(得分:4)

if len(arr) == 1

什么都没有回来......

将其更改为

def powerset(arr):
    if len(arr)>0:
         return powerset(arr[1:])+[arr[0]]
    else:
         return []

这是来自https://docs.python.org/2/library/itertools.html

的powerset函数
def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

这是一个使用稍微不那么神奇的PowerSet实现

def powerset(seq):
    """
    Returns all the subsets of this set. This is a generator.
    """
    if len(seq) <= 1:
        yield seq
        yield []
    else:
        for item in powerset(seq[1:]):
            yield [seq[0]]+item
            yield item

print list(powerset([1,2]))

答案 1 :(得分:1)

如果arr只有一个元素,那么你就不会返回任何内容。这变为。你的倒数第二次迭代会爆发,因为powerset()是None。

更改一行:

BODY[<section>]<<partial>>

    The text of a particular body section.  The section
    specification is a set of zero or more part specifiers
    delimited by periods...

......变成......

elif len(arr) > 1: