这个问题已经在这里有一个答案:
- 从排序顺序排序的迭代器在Python屈服? 1个回答
有没有在Python优雅的方式来遍历两个迭代器在归并算法在合并阶段的方式做? 我的意思是假定list1
和list2
是按排序顺序(假设上升,但它并不重要)。 我想通过同时在两个名单,下一个项目返回最小的两个迭代next
无论从列表中的项目。 它也将不得不处理逻辑一样if list1 is empty:, just return from list2
。
此外,我想选择一个特定的键用于比较的能力,就像Python允许做它的所有标准排序时。
我认为要做到这一点最简单的方法是有临时变量,每个迭代器,存储从迭代器的“当前”值。 然后,你可以对两个变量,而不是从迭代器获取,这将导致你的问题比较。
# 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
知道什么时候迭代器中的一个已经用完的数据; 当这种情况发生,我们只是转储其它迭代器的剩余内容进入我们的名单。 (虽然我们也有从其他列表变量附加)。