Вот тебе функция слияния упорядоченных списков как пример
def merge(left, right):
"""Merge two lists in ascending order."""
lst = []
while left and right:
if left[0] < right[0]:
lst.append(left.pop(0))
else:
lst.append(right.pop(0))
if left:
lst.extend(left)
if right:
lst.extend(right)
return lst
Обрати внимание, что вливание оставшихся элементов происходит за пределами цикла. Если у тебя в первом списке десять элементов, из которых все меньше любого элемента второго списка, а во втором списке миллион элементов, то не надо этот миллион элементов вливать с проверками, достаточно просто их влить. Перепишешь свой код с учётом этой инфы.
И второе
PooH
def iter_points(r1, r2):
seq1, seq2 = r1.points, r2.points
Не надо подавать непонятно что в функцию, иначе ты эту функцию потом ни к чему больше не применишь. Надо упростить передаваемые данные. Это должны быть либо сами элементы, либо уже подготовленные элементы для возврата.
Что значит, что ты не применишь функцию ни к чему больше? Это значит, что при написании новой программы ты будешь сотни функций писать с нуля, потому что в прошлых проектах ни одну функцию в готовом виде будет невозможно взять. Там тебе в одном проекте показалось это удобным, а в десяти новых проектах ты должен писать десять новых точно таких же функций.
Вот пример, сортировку слиянием я написал в 2013 году (4 года назад)
[guest@localhost funcs]$ stat -c %y merge.py
2013-03-05 10:53:48.000000000 +1100
[guest@localhost funcs]$
И вот я её беру и сортирую твои точки, про которые тогда я, естественно, и не предполагал
>>> def merge(left, right):
... """Merge two lists in ascending order."""
... lst = []
... while left and right:
... if left[0] < right[0]:
... lst.append(left.pop(0))
... else:
... lst.append(right.pop(0))
... if left:
... lst.extend(left)
... if right:
... lst.extend(right)
... return lst
...
>>>
>>> import itertools
>>>
>>> class A: pass
...
>>> r1 = A()
>>> r2 = A()
>>>
>>> r1.points = [1, 4, 8]
>>> r2.points = [2, 5, 9]
>>>
>>> merge(list(zip(r1.points, itertools.cycle('a'))), list(zip(r2.points, itertools.cycle('b'))))
[(1, 'a'), (2, 'b'), (4, 'a'), (5, 'b'), (8, 'a'), (9, 'b')]
>>>
Мне не надо ничего писать, я просто взял функцию без каких-либо изменений и сразу использовал. Точно так же я делал здесь программу для сохранения закладок из Chrome. У меня была программа по сохранению закладок из Firefox, я взял из неё кусок, поменял в нём содержимое только одной функции (из примерно десяти функций) и применил к json-данным из Chrome - и всё сработало, как часы. За десять минут я написал новую программу, которая не планировалась изначально.