我是python的新手。
我尝试在python中实现类似merge排序的东西。我使用了来自https://pythonhosted.org/llist/#sllist-objects的单链表。要合并两个排序列表,我需要使用迭代器遍历这两个列表。伪代码看起来像:
n3 = sllist()
for n1 in list1 and n2 in list2:
if (n1 > n2):
n3.append(n1)
n1++ # c way of doing thing
else:
n3.append(n2)
n2++ # c way of doing thing
但我不知道如何在python中使用它。任何指针或提示都会有所帮助。
编辑: 经过所有的讨论和建议,我想出了类似的代码。任何人都可以告诉我,如何摆脱最后两个循环。我打算使用“扩展”但无法使用它。
final_list = sllist()
node1 = list1.first
node2 = list2.first
while node1 and node2:
if node1.value < node2.value:
final_list.append(node1)
node1 = node1.next
else:
final_list.append(node2)
node2 = node2.next
while node1:
final_list.append(node1)
node1 = node1.next
while node2:
final_list.append(node2)
node2 = node2.next
return final_list
答案 0 :(得分:3)
我通常使用iterables和next
执行此操作:
lst1 = iter(list1)
lst2 = iter(list2)
out = sllist()
sentinel = object()
n1 = next(lst1, sentinel)
n2 = next(lst2, sentinel)
while n1 is not sentinel and n2 is not sentinel:
if n1 > n2:
out.append(n2)
n2 = next(lst2, sentinel)
elif n2 >= n1:
out.append(n1)
n1 = next(lst1, sentinel)
out.extend(lst1)
out.extend(lst2)
正如评论中所指出的,你也可以把它写成:
lst1 = iter(list1)
lst2 = iter(list2)
out = sllist()
try:
n1 = next(lst1)
n2 = next(lst2)
while True:
if n1 > n2:
out.append(n2)
n2 = next(lst2)
elif n2 >= n1:
out.append(n1)
n1 = next(lst1)
except StopIteration: # raised when next(...) fails.
out.extend(lst1)
out.extend(lst2)
它在功能上是等同的。随便选择你喜欢的任何一个: - )
答案 1 :(得分:1)
你做这件事的方式你需要索引
这样:
while i < len(list1) and j < len(list2):
if list1[i] > list2[j]:
n3.append(list1[i])
i+=1
else:
n3.append(list2[j])
j+=1
n3.extend(list1[i:])
n3.extend(list2[j:])