在Python中对两个迭代器进行Mergesort样式迭代

时间:2014-09-02 15:00:38

标签: python iterator iteration

Python中是否有一种优雅的方式以mergesort算法在合并阶段的方式迭代两个迭代器?我的意思是假设list1list2按排序顺序(让我们说升序,但没关系)。我想同时遍历两个列表,其中返回的下一个项目是任一列表中两个next项中最小的一个。它还必须处理像if list1 is empty:, just return from list2这样的逻辑。

此外,我希望能够选择用于比较的特定键,就像Python允许进行所有标准排序一样。

1 个答案:

答案 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以了解其中一个迭代器何时耗尽数据;当发生这种情况时,我们只是将其他迭代器的剩余内容转储到我们的列表中。 (虽然我们还必须从另一个列表中附加该变量。)