归并式的迭代超过两个迭代器在Python [复制](Mergesort-style iteratio

2019-10-20 20:58发布

这个问题已经在这里有一个答案:

  • 从排序顺序排序的迭代器在Python屈服? 1个回答

有没有在Python优雅的方式来遍历两个迭代器在归并算法在合并阶段的方式做? 我的意思是假定list1list2是按排序顺序(假设上升,但它并不重要)。 我想通过同时在两个名单,下一个项目返回最小的两个迭代next无论从列表中的项目。 它也将不得不处理逻辑一样if list1 is empty:, just return from list2

此外,我想选择一个特定的键用于比较的能力,就像Python允许做它的所有标准排序时。

Answer 1:

我认为要做到这一点最简单的方法是有临时变量,每个迭代器,存储从迭代器的“当前”值。 然后,你可以对两个变量,而不是从迭代器获取,这将导致你的问题比较。

# 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)

在这里,我们存储在一个变量,我们可以看一下,并没有触发迭代器本身比较每个迭代器的“下一个”值。 当我们添加变量新的列表中的一个,我们通过触发该迭代器取代它。 在这里,我们正在追赶StopIteration知道什么时候迭代器中的一个已经用完的数据; 当这种情况发生,我们只是转储其它迭代器的剩余内容进入我们的名单。 (虽然我们也有从其他列表变量附加)。



文章来源: Mergesort-style iteration over two iterators in Python [duplicate]