求一个 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 ? 求高人解答一下
1
Valyrian 2016-07-27 05:45:32 +08:00
for result in results:
results.extend([result + [num]]) results 每次都变多一个。。 for 永远没法到头 |
2
SayHaHa 2016-07-27 07:26:39 +08:00 via Android
.不要在循环里对循环的对象做增添或删除操作
|
3
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 |
4
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 |
5
abcyuxue123 OP 谢谢大家,懂了,因为 iterator 用在改变的 list 上
会再避免出现类似的问题 |