Python Power set,无法弄清楚我的错误

时间:2016-07-26 21:37:22

标签: python powerset

我的代码会崩溃并永远运行:

def subsets(nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    results = [[]]
    for num in nums:
        for result in results:
            results.extend([result + [num]])
    return results 

我用谷歌搜索,找到类似的解决方案:

def subsets(nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    results = [[]]
    for num in nums:
        results.extend([result + [num] for result in results])
    return results

这有什么区别?

1 个答案:

答案 0 :(得分:4)

关键部分是:

$1

在这里,您将遍历for result in results: results.extend([result + [num]]) 列表。迭代器总是存在的东西,直到你真正到达终点才能完成。对于列表,您可以简单地将其想象为从第一个元素开始的指针,然后继续前进到下一个元素直到结束。

除非在您的情况下,您在每次迭代时向results列表添加一个元素(因为[result + [num]]是一个元素列表)。因此,当迭代器继续向前发展时,你会不断向最后添加一个元素,以确保迭代器永远不会到达终点。

作为一般规则,您永远不应该修改当前正在迭代的集合。所以在这种情况下,你不应该在迭代同样的事情时修改results

这正是其他解决方案中的以下几行避免的:

results

这使用列表理解,基本上等同于:

results.extend([result + [num] for result in results])

正如您所看到的,tmp = [] for result in results: tmp.append(result + [num]) results.extend(tmp) 未经过修改,而在其上进行迭代。首先创建results列表,然后一旦完成,tmp列表将通过整个results列表进行修改来修改。