Индекс списка вне диапазона, и я получил ошибку в моем блоке if, который находится внутри цикла while - PullRequest
0 голосов
/ 28 марта 2020
def merge(a1,a2):
    if len(a1)<1:
        return a2
    if len(a2)<1:
        return a1
    a1item=a1[0]
    a2item=a2[0]
    i=1
    j=1
    merge=[]
    while(a1item or a2item):
        print(a1item,a2item)
        if a1item<a2item:
            merge.append(a1item)
            a1item=a1[i]
            i+=1
        else:
            merge.append(a2item)
            a2item=a2[j]
            j+=1
        print(merge)


merge([1,2,3],[3,54,100])

Я получил ошибку в a1item = a1 [i] , как остановить, когда l oop указывает на последний элемент. Предложить мне без использования встроенной функции

1 Ответ

1 голос
/ 28 марта 2020

Вам нужно проверить свои границы самостоятельно - кроме того, что вы получите еще одну ошибку, которая может произойти, если вы объедините [0,1,2,3] и [0,4,8]:

while (0 или 0):

- это ложь , и ваша функция не будет работать в это время l oop.

Исправления с комментариями:

def merge(a1,a2):
    if len(a1)<1:
        return a2
    if len(a2)<1:
        return a1
    i=0
    j=0
    # store result once - micro-optimization
    la1 = len(a1)
    la2 = len(a2)  

    m=[] # do not call variables the same as the function, in case you want to recurse

    # I removed the variables to hold the current values in favor 
    # of directly indexing them
    while True: # beware of (0 or 0) which is falsy
        print(a1[i],a2[j],end=" -> ")
        if a1[i] <= a2[j]:  # one more "true" value in first if branch
            m.append(a1[i]) # if both are same, we take from the 1st list
            i+=1            # no need to branch into the else part
        else:
            m.append(a2[j])
            j+=1
        print(m)

        # stop conditions: if one list is done, add the other to the end of m
        if i == la1:
            m.extend(a2[j:])
            break
        if j == la2:
            m.extend(a1[i:])
            break
    return m


print("----",merge([1,6,9],[0,7,8,11]))

Вывод:

1 0 -> [0]
1 7 -> [0, 1]
6 7 -> [0, 1, 6]
9 7 -> [0, 1, 6, 7]
9 8 -> [0, 1, 6, 7, 8]
9 11 -> [0, 1, 6, 7, 8, 9]
---- [0, 1, 6, 7, 8, 9, 11]

Вы можете узнать больше о нарезке списка здесь: Понимание обозначения среза

...