Python power set 求解,看不出 bug

2016-07-27 05:43:08 +08:00
 abcyuxue123

求一个 list 的所有 power set

比如: nums = [1,2,3]

答案:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

我的代码,有错,要 run forever

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(self, nums):
    """
    :type nums: List[int]
    :rtype: List[List[int]]
    """
    results = [[]]
    for num in nums:
        results.extend([result + [num] for result in results])
    return results

可是 why ? 求高人解答一下

2392 次点击
所在节点    Python
5 条回复
Valyrian
2016-07-27 05:45:32 +08:00
for result in results:
results.extend([result + [num]])

results 每次都变多一个。。 for 永远没法到头
SayHaHa
2016-07-27 07:26:39 +08:00
.不要在循环里对循环的对象做增添或删除操作
yelite
2016-07-27 07:36:19 +08:00
for result in results[:]:

把 results 复制一份再循环就没问题了

对 list 循环的过程,可以看作是首先由 list 生成了 iterator ,然后不断调用 __next__ 方法取得下一个值。 iterator 会持有对 list 的引用和当前的 index 。所以在循环过程中对原始的 list 作改动会产生各种奇怪的效果。

In[2]: nums = [1,2,3,4]
In[3]: i = iter(nums)
In[4]: i
Out[4]: <list_iterator at 0x10c4b7e80>
In[5]: next(i)
Out[5]: 1
In[6]: nums.pop(0)
Out[6]: 1
In[7]: next(i)
Out[7]: 3
oclock
2016-07-27 08:38:10 +08:00
内层 for 在遍历 results 的同时又在修改 results ,这是常见的应该避免的情况

按楼主的双 for 循环可以这么写

results = []
for n in nums:
results.extend([s[:] + [n] for s in results])
results.append([n])
results.append([])
return results
abcyuxue123
2016-07-27 21:34:36 +08:00
谢谢大家,懂了,因为 iterator 用在改变的 list 上

会再避免出现类似的问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/295155

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX