有谁能告诉我我的代码有什么问题?输入是n迭代器。我需要制作生成器,它可以在飞行中产生合并列表的值。我不想使用heapq,queue或deque。
#!/usr/bin/python
def min_(ar):
l = list()
for val, array in ar:
l.append(val)
return l.index(min(l))
def k_way_merge(*args):
data = list()
for array in args:
data.append((array.next(), array))
while data:
index = min_(data)
key, value = data[index]
data.remove(data[index])
yield key
if value:
data.append((next(value), value))
l=[[1,3], [2,4], [10,100],[100,101]]
res = k_way_merge(iter(l[0]), iter(l[1]),iter(l[2]),iter(l[3]))
for i in res:
print i
结果是:
1
2
3
似乎next(value)
引发了StopIteration,但是如何修复所有......帮助
答案 0 :(得分:1)
迭代器在空时不会计算为False。你必须使用带有标记值的下一个内置函数:
END = object()
while data:
index = min_(data)
key, value = data.pop(index)
yield key
key = next(value, END)
if key is not END:
data.append((key, value))
此外,由于min_
会返回索引,为什么要使用data.remove(data[index])
- 只需使用pop
。
答案 1 :(得分:0)
如果value
为空,则需要将此操作设为可选:
if value:
data.append((next(value), value))
此更改对我有用:
if value:
try:
data.append(next(value), value)
except StopIteration:
pass