2017-03-14 32 views
0

我試圖在python中實現合併排序,我想知道循環遍歷兩個列表的pythonic方式是什麼,每個循環只遍歷一個列表。如何循環遍歷兩個列表,每次迭代一個列表?

這是我現在(使用索引)

def merge(array1, array2): 
    final = [] 
    i = 0 
    j = 0 
    while i < len(array1) or j < len(array2): 
     if array1[i] <= array2[j]: 
      final.append(array1[i]) 
      i += 1 
     elif array2[j] < array1[i]: 
      final.append(array2[j]) 
      j += 1 
     # Finished one of the arrays 
     if i == len(array1): 
      final.extend(array2[j:]) 
      break 
     elif j == len(array2): 
      final.extend(array1[i:]) 
      break 
    return final 

感謝。

+0

'而真:'循環內的+流控制處理遞增+代碼的方式'break'。這與你正在做的很相似 –

+1

這會失敗,因爲如果'i> = len(array1)'但是'j

+4

你不應該讓這個問題依賴於合併排序的知識。它會得到更多的關注,如果你使它通用,它不會與錯誤或更正算法混在一起 – slezica

回答

0

我不確定您的問題是否使用索引,但是有很多不需要的代碼。

首先,我們可以改變你的initialisers到:

final, i, j = [], 0, 0 

接下來,如果我們改變您的while條件,我們可以刪除break S:

while i < len(array1) and j < len(array2): 

elif是沒有意義的,因爲它將永遠是真實的,我們可以因此使您的if

if array1[i] <= array2[j]: 
    final.append(array1[i]) 
    i += 1 
else: 
    final.append(array2[j]) 
    j += 1 

而現在,因爲我們打破自動循環了,我們不需要break S和可移動以外的extend S:

def merge(array1, array2): 
    final, i, j = [], 0, 0 
    while i < len(array1) and j < len(array2): 
     if array1[i] <= array2[j]: 
      final.append(array1[i]) 
      i += 1 
     else: 
      final.append(array2[j]) 
      j += 1 
    final.extend(array1[i:]) 
    final.extend(array2[j:]) 
    return final 

這讓你更小,更可讀的代碼,而無需實際改變你做任何事的方式,這樣你仍然可以理解它。


注意,我們可以執行:

final.extend(array1[i:]) 
final.extend(array2[j:]) 

循環外,因爲一個陣列將有內容,例如[7,9],而另一個將是空的([]):

>>> final = [3,6] 
>>> array1 = [3,6] 
>>> array2 = [7,9] 
>>> i = 2 
>>> j = 0 
>>> array1[i:] 
[] 
>>> array2[j:] 
[7, 9] 
>>> final.extend(array1[i:]) 
>>> final 
[3, 6] 
>>> final.extend(array2[j:]) 
>>> final 
[3, 6, 7, 9]