没有heapq的K-way-merge和使用python的任何其他库

时间:2014-01-13 19:39:29

标签: python algorithm array-merge

有谁能告诉我我的代码有什么问题?输入是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,但是如何修复所有......帮助

2 个答案:

答案 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