2017-08-31 83 views
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 

出於某種原因,while循環似乎只運行一次。例如,如果我用list=['a','x','z']list2=['b','c','f','g'],打印行的函數結果的末尾['a']['x','z']['b','c','f','g']

從調試這似乎是由於while循環只執行一次,但我不知道爲什麼會發生的事情。 ..它應該一直到l1l2爲空

+1

......因爲'return'離開函數之前'while'有機會第二次運行? –

回答

1

這是因爲函數在返回某些東西后會中斷。您需要取消縮進你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 

另外,如果由於某種原因,你想你的函數產生的所有步驟的列表,你實際上可以在完全相同的斑點使用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)) 
     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']] 

當然,你會看到最後一個列表產生是這樣rt列表:)。

+0

OP也可能想檢查出的['zip'](https://docs.python.org/3/library/functions.html#zip)內置函數。 –

+0

嘆氣,當然這是一個愚蠢的事情,像一個縮進問題。我一直在檢查事實以確保if/else語句正確縮進,但完全忽略了返回錯誤的地方。一定是盯着這太久了。 我正準備回沒有做任何在多年後學習一些編程。當我回到學校時,它都是C++。我仍然缺少大括號來分割掉塊拋出... – wildpygmy

+0

@wildpygmy發生在我們所有不用擔心笑 – TerryA