我试图在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 :(得分: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]