如何循环浏览两个列表,一次只迭代一个?

时间:2017-03-14 15:22:52

标签: python list loops iterator

我试图在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

感谢。

1 个答案:

答案 0 :(得分:0)

我不确定你的问题是否在使用索引,但是有很多不需要的代码。

首先,我们可以将您的初始化程序更改为:

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

接下来,如果我们更改了您的while条件,我们就可以删除break

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并且可以将extend移到外面:

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]