2016-11-28 49 views
0

我正在處理兩個列表並試圖線性地執行此操作。我必須看看每個列表元素。要通過第一個列表,我已經使用了一個for循環。然後,我嵌套了第二個循環 - 試着和while - 遍歷我的第二個列表。我試圖將列表排序到更大的排序列表中,因爲我遍歷每個列表元素。我使用了一個計數器來索引第二個列表。在通過第二個列表時,儘管試圖將最高索引值限制爲第二個列表的長度,但我仍然得到'索引'錯誤。如何在列表最大長度限制最大索引後修復索引錯誤?

TLDR - 當我將最高索引指定爲列表的長度時,爲什麼我會不斷收到索引錯誤?

通過谷歌excercises下面列出,代碼工作:

# E. Given two lists sorted in increasing order, create and return a merged 
# list of all the elements in sorted order. You may modify the passed in lists. 
# Ideally, the solution should work in "linear" time, making a single 
# pass of both lists. 
def linear_merge(list1, list2): 
    x = [] 
    j = 0 
    for item1 in list1: 
     print("1\t", str(item1)) 
     while item1 >= list2[j] and j < len(list2): 
      x.append(list2[j]) 
      j += 1 
     x.append(item1) 

我已經得到了以下錯誤:

in linear_merge 
    while item1 >= list2[j] and j < len(list2): 

IndexError: list index out of range 

這裏的嘗試與for循環的問題:

def linear_merge(list1, list2): 
    x = [] 
    j = 0 
    for item1 in list1: 
     print("1\t", str(item1)) 
     for item2 in list2[j:]: 
      print("2\t", str(item2)) 
      if item1 >= item2: 
       x.append(item2) 
       if j <= len(list2): 
        j += 1 
      else: 
       x.append(item1) 
    return x 

我用指數做了什麼錯誤?有什麼我在這裏失蹤?

回答

1

交換兩次測試的順序:

while j < len(list2) and item1 >= list2[j]: 

這樣,如果j超出範圍,第二測試將不會進行評價。

+0

爲什麼測試的順序事while循環運行?既然它不是'or',它會不會退出while循環而不管測試的順序如何,只要一個是錯誤的? – thleo

+0

顯然不是,否則你不會在這裏。你的問題不是停止循環;你的問題是避免出界的錯誤。 –

+1

第二個問題:第一個問題:Python與其他許多語言一樣,在邏輯表達式中使用「快捷方式評估」。在'和'表達式中,如果第一個子條件是假的,則整個條件必然是假的,並且不需要評估第二個子條件。 (當整個條件評估爲False時,你的'while'循環停止。)這個快捷方式也有這樣的優點:第一個子條件可以防止第二個子條件中的索引錯誤。此功能經常使用。 –

0

,則應該更換2次測試的地方在這種情況下:

while item1 >= list2[j] and j < len(list2): 

到:

while j < len(list2) and item1 >= list2[j]: 
相關問題