2016-07-26 7 views
0

私のコードがクラッシュし、永遠に実行されます私の誤りを把握することはできませんPythonのパワーセットは、

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 

ここでの違いは何ですか?あなたはresultsリストを反復処理され、ここで

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

答えて

4

重要な部分はこれです。イテレーターは常に生きているもので、実際に終わりに達するまで終わらない。リストの場合は、最初の要素から始まり、最後に到達するまで次の要素に移動し続けます。

あなたのケースでは、すべての繰り返しでresultsリストに要素を追加しています([result + [num]]は1要素のリストです)。イテレータが前進し続けるように、イテレータが最後まで到達できないことを確実にするために、最後に要素を1つ追加し続けます。

一般的に、現在反復処理中のコレクションは変更しないでください。この場合、同じことを繰り返す間にresultsを変更しないでください。

そして、それは、他の溶液中の次の行は避けまさにだ:

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

これは、リスト内包表記を使用し、これと本質的に同等である:

tmp = [] 
for result in results: 
    tmp.append(result + [num]) 
results.extend(tmp) 

あなたが見ることができるように、resultsがあります変更されていないが反復されます。 tmpリストが最初に作成され、それが完了すると、resultsリストはtmpリスト全体で拡張されて変更されます。

関連する問題