Python中是否有一种优雅的方式以mergesort算法在合并阶段的方式迭代两个迭代器?我的意思是假设list1
和list2
按排序顺序(让我们说升序,但没关系)。我想同时遍历两个列表,其中返回的下一个项目是任一列表中两个next
项中最小的一个。它还必须处理像if list1 is empty:, just return from list2
这样的逻辑。
此外,我希望能够选择用于比较的特定键,就像Python允许进行所有标准排序一样。
答案 0 :(得分:0)
我认为最简单的方法是使用临时变量(每个迭代器一个)来存储" current"来自迭代器的值。然后你可以对这两个变量进行比较,而不是从迭代器中取出,这会给你带来问题。
# This function dumps one iterator into your list, in case one of the two
# runs out of values.
def dump_iter(iterator, newlist):
for i in iterator:
newlist.append(i)
return newlist
iter1 = # Your first iterator.
iter2 = # Your second iterator.
newlist = []
# Get initial values.
try:
var1 = iter1.next()
except StopIteration:
return dump_iter(iter2, newlist)
try:
var2 = iter2.next()
except StopIteration:
newlist.append(var1)
return dump_iter(iter1, newlist)
# Now we actually perform the merge sort.
while True:
if var1 <= var2:
newlist.append(var1)
try:
var1 = iter1.next()
except StopIteration:
newlist.append(var2)
return dump_iter(iter2, newlist)
else:
newlist.append(var2)
try:
var2 = iter2.next()
except StopIteration:
newlist.append(var1)
return dump_iter(iter1, newlist)
在这里,我们正在存储&#34; next&#34;变量中每个迭代器的值,我们可以在不触发迭代器本身的情况下查看和比较。当我们将其中一个变量添加到新列表中时,我们通过触发迭代器来替换它。在这里,我们正在捕捉StopIteration
以了解其中一个迭代器何时耗尽数据;当发生这种情况时,我们只是将其他迭代器的剩余内容转储到我们的列表中。 (虽然我们还必须从另一个列表中附加该变量。)