Я новичок в работе с алгоритмами, и моей задачей было объединить два отсортированных списка в один, используя цикл for, а не цикл while. Я застрял в определении конца списка:
list1=[1,2,4]
list2=[1,3,4,6]
def mergeTwoLists(list1: list, list2:list) -> list:
l = 0
r = 0
lRange = len(list1)-1
rRange = len(list2)-1
total_range = (len(list1)+len(list2))-1
merger = []
for i in range(total_range):
if list1[l]<=list2[r]:
merger.insert(i,list1[l])
if l<lRange:
l+=1
elif list1[l]>list2[r]:
merger.insert(i,list2[r])
if r<rRange:
r+=1
return(merger)
Он возвращает [1,1,2,3,4,4] и пропускает последнее значение 6.
да, но тогда я выхожу из ошибки индекса
Почему вы используете insert()
вместо append()
?
@MikeCurtis Исправьте ошибку индекса, проверив, что l
и r
находятся в пределах диапазона, прежде чем использовать их.
Вы пытаетесь одновременно просмотреть два списка, но затем в одном из них заканчиваются индексы. Вы не можете использовать l
и r
одновременно. Единственный раз, когда вы можете использовать оба индекса, - это когда они оба находятся в своих пределах, поэтому переосмыслите свой цикл.
Вам не хватает последнего элемента, потому что вы вычитаете 1 при создании total_range
.
Вам нужно проверить, какой индекс все еще находится в пределах диапазона внутри цикла. Вы можете сравнивать элементы только тогда, когда оба индекса находятся в диапазоне соответствующих списков. Как только вы дойдете до конца одного из списков, просто скопируйте остальную часть другого списка в результат.
def mergeTwoLists(list1: list, list2:list) -> list:
l = 0
r = 0
lRange = len(list1)
rRange = len(list2)
total_range = lRange + rRange
merger = []
for i in range(total_range):
if l < lRange and r < rRange:
if list1[l]<=list2[r]:
merger.append(list1[l])
l+=1
elif list1[l]>list2[r]:
merger.append(list2[r])
r+=1
elif l < lRange:
merger.extend(list1[l:])
break
else:
merger.extend(list2[r:])
break
return(merger)
list1=[1,2,4]
list2=[1,3,4,6]
print(mergeTwoLists(list1, list2))
Следующие работы для различных видов списков. Он получает элементы из списков асинхронно и прерывает цикл, когда заканчивается длина любого списка. Наконец, он добавляет любые лишние элементы из другого списка.
def mergeSortedLists(l1, l2):
outlist =[]; i=0; j=0;
while i<len(l1) and j<len(l2):
a = l1[i]; b = l2[j]
if a<b:
outlist.append(a); i+=1
else:
outlist.append(b); j+=1
outlist += l1[i:] + l2[j:]
print(outlist)
Пытаться:
list1=[1,2,4]
list2=[1,3,4,6,7]
mergeSortedLists(list1, list2)
выход:
[1, 1, 2, 3, 4, 4, 6, 7]
Или:
list1=[1,2,3]
list2=[4,5,6,8]
mergeSortedLists(list1, list2)
Выход:
[1, 2, 3, 4, 5, 6, 8]
Может работать для этого конкретного примера, но произойдет сбой, как только несколько элементов должны появиться из одного и того же списка.
Он должен работать. Я добавил пример более длинного списка.
Попробуйте [1,2,3]
и [4,5,6]
.
Я изменил свой код в ответе выше. Теперь это работает.
Теперь, когда вы отказались от идеи использовать zip
, есть шанс, что это правильно.
Рассматривали ли вы возможность не вычитать 1 при расчете диапазона индексов?