优化在IF条件下嵌套的while循环

时间:2019-05-15 21:34:35

标签: python mergesort

我要完成的工作是:给两个以递增顺序排序的列表,创建并返回所有元素按排序顺序的合并列表(合并排序)

我写的代码是:

def linear_merge(list1, list2):
    a = 0
    for it2 in list2:
        if a < len(list1):
            while it2 > list1[a]:
                a += 1
                if a == len(list1):
                    break

        list1.insert(a, it2)
        a += 1
    return(list1)

我最初将以下while条件与前面的IF结合使用:

while it2 > list1[a] and a < len(list1):

但这一直给我以下关于list1 = ['aa', 'xx', 'zz']list2 = ['bb', 'cc']

的错误
  

文件“ / Users / zainkhaishagi   1 / Downloads / google-python-exercises / basic / list2.py“,第35行,在   linear_merge       而it2> list1 [a]和

在调试时,即使while条件中的AND设置为false,似乎传递到list1的索引也超出范围。我希望false AND条件可以使while条件成为false,而无需检查索引list1。显然不是这样。

  1. 我在这里是否遗漏了一些东西,因为即使单个输入为False,AND也应该为False?
  2. 是否可以使用与我使用的相同方法进一步优化此代码? (我给自己的限制是不要创建一个新列表,不要使用多个变量,并且要在列表上迭代最少的次数)

1 个答案:

答案 0 :(得分:1)

只需更改最初的顺序:

while it2 > list1[a] and a < len(list1)

收件人:

while a < len(list1) and it2 > list1[a]

如果第一个条件不是True,将不再进行评估。看看这个例子,没有附加的if

def linear_merge(list1, list2):
    a = 0
    for it2 in list2:
        while a < len(list1) and it2 > list1[a]:
            a += 1
            if a == len(list1):
                break

        list1.insert(a, it2)
        a += 1
    return list1

希望对您有帮助!