Даже больше Pythonic будет примерно таким (поскольку похоже, что вы перебираете оба списка, пока один не достигнет значения 'None'):
for l1val,l2val in zip(l1,l2):
if l1val is None or l2val is None:
break
... rest of while loop goes here, using l1val and l2val
instead of l1[i] and l2[i]
На самом деле, ни один страж не выглядит немного странно. Если это то, что вы добавили в конец, чтобы вы знали, когда находитесь в конце списка, не беспокойтесь - просто используйте собственные функции итерации Python (поскольку циклы автоматически останавливаются в конце списка, по которому они повторяются. *)
for l1val,l2val in zip(l1,l2):
... body of while loop goes here, using l1val and l2val
instead of l1[i] and l2[i]
* - Они на самом деле не останавливаются автоматически - итератор списка вызывает исключение StopIteration, которое перехватывается циклом for как сигнал о прекращении цикла.
Мой хрустальный шар становится нечетким, но в названии вашего метода 'слияние' есть еще одна подсказка. Допустим, слияние занимает два списка, и каждый список представляет собой список целых чисел, а под словом «слияние» вы подразумеваете возвращение нового списка сумм соответствующих значений в l1 и l2. Вот как выглядит слияние с циклом for:
def merge(l1, l2):
retl = []
for v1,v2 in zip(l1, l2):
retl.append(v1+v2)
return retl
Будучи новичком, вы должны изучить и освоить очень концепцию, называемую «списочным пониманием». Используя понимание списка, вы можете упростить ваш метод слияния до простого:
def merge(l1, l2):
return [v1+v2 for v1,v2 in zip(l1, l2)]
Это эквивалентно предыдущей функции - пожалуйста, изучите их и посмотрите, как это работает. И наконец, в мгновение ока, набирающего уток в Python, запустите команду merge as-is , но на этот раз передайте ему список списков вместо списка целых чисел. (оставлено как упражнение для ОП.)