2017-08-31 7 views
1

2つのソートされたリストを結合されたソートされたリストにマージするはずの関数があります。私はこれを達成する他の方法がある知っているが、このコードはwhileループは一度だけ実行するように思われるいくつかの理由について2つのリストをループすると1回だけ繰り返されます

def merge_two(list1,list2): 
    new=[] 
    l1=list1[:] 
    l2=list2[:] 
    while l1 and l2: 
     if l1[0]<l2[0]: 
      new.append(l1.pop(0)) 
     else: 
      new.append(l2.pop(0)) 
     print(new,l1,l2)  
     return new+l1+l2 

動作しない理由を誰かが説明することができます。例えば、私はlist=['a','x','z']list2=['b','c','f','g']を使用している場合、これをデバッグから['a']['x','z']['b','c','f','g']

における関数の結果の最後に印刷ラインは一度だけ実行するwhileループが原因のようですが、それが起こって、なぜ私はわかりません。 .. l1またはl2のいずれかが空になるまでお待ちください。

+1

... 'return'は' while'が2回目の実行の前に関数を残すためですか? –

答えて

1

何かを返すと関数が壊れてしまうからです。あなたは解除インデントにあなたのreturn文が必要です。何らかの理由で、あなたの関数が生成されたすべてのステップのリストをご希望の場合は、実際に同じ場所にyield代わりのreturnを使用することができ、あるいは、

def merge_two(list1,list2): 
    new=[] 
    l1=list1[:] 
    l2=list2[:] 
    while l1 and l2: 
     if l1[0]<l2[0]: 
      new.append(l1.pop(0)) 
     else: 
      new.append(l2.pop(0)) 
    return new+l1+l2 

をおであなたのリターンを使用:

def merge_two(list1,list2): 
    new=[] 
    l1=list1[:] 
    l2=list2[:] 
    while l1 and l2: 
     if l1[0]<l2[0]: 
      new.append(l1.pop(0)) 
     else: 
      new.append(l2.pop(0)) 
     yield new+l1+l2 

そして、それを実行している:

>>> list(merge_two(a, b)) 
[['a', 'x', 'z', 'b', 'c', 'f', 'g'], 
['a', 'b', 'x', 'z', 'c', 'f', 'g'], 
['a', 'b', 'c', 'x', 'z', 'f', 'g'], 
['a', 'b', 'c', 'f', 'x', 'z', 'g'], 
['a', 'b', 'c', 'f', 'g', 'x', 'z']] 

そしてもちろん、あなたが最後のリストが得られることがわかりますすることはそうですrtedリスト:)。

+0

OPはまた、['zip'](https://docs.python.org/3/library/functions.html#zip)組み込み関数をチェックアウトすることもできます。 –

+0

一息、それはもちろん、インデント問題のような愚かなものでした。私は、if/else文が正しく字下げされていることを確認するために事実をチェックしていましたが、戻りが間違った場所にあることを完全に見落としました。これをあまりにも長く見ていたに違いありません。 私は何年も前に何もしないうちにいくつかのプログラミングを学んでいます。私が学校で学んだとき、それはすべてC++でした。私はまだブロックを分割するための中括弧の欠如によって投げられています... – wildpygmy

+0

@wildpygmy私たちすべてに起こる笑を心配しないでください – TerryA

関連する問題