Более Pythonic способ, как правило, вообще не использовать индексы, и предпочтительно не использовать исключения в качестве средства управления «намеченной» программной логикой.Вам также следует избегать лишних скобок.
Вот как это можно сделать с помощью итераторов:
def merge(a, b, cond=lambda x, y : x < y):
Done = []
iterA, iterB = iter(a), iter(b)
valueA, valueB = next(iterA, Done), next(iterB, Done)
result = []
while not(valueB is Done and valueA is Done):
if valueB is Done or valueA is not Done and cond(valueA, valueB):
result.append(valueA)
valueA = next(iterA, Done)
else:
result.append(valueB)
valueB = next(iterB, Done)
return result
Это дает дополнительное преимущество, заключающееся в том, что функция работает эффективно с любыми итеративными данными в качестве параметров.
например:
print(merge(range(5, 10), range(7, 15)))
# [5, 6, 7, 7, 8, 8, 9, 9, 10, 11, 12, 13, 14]
Также упрощается создание итерационной версии функции для отложенного обхода:
def iMerge(a, b, cond=lambda x, y : x < y):
Done = []
iterA, iterB = iter(a), iter(b)
valueA, valueB = next(iterA, Done), next(iterB, Done)
while not(valueB is Done and valueA is Done):
if valueB is Done or valueA is not Done and cond(valueA, valueB):
yield valueA
valueA = next(iterA ,Done)
else:
yield valueB
valueB = next(iterB, Done)
EDIT Изменено None
на Done
, чтобы функция поддерживала None как допустимое значение в списках ввода.