用于循环的Python处理以进行比较

时间:2013-04-02 15:45:19

标签: python

我需要比较2个类似架构的表并有2个生成器对象。如何在Python中逐行比较这两个生成器。需要实现文件比较逻辑,

If generator-object-1 =  generator-object-1:
        then read-next-row-generator-object-1,read-next-row-generator-object-1
elif generator-object-1 >  generator-object-2:
        then read-next-row-generator-object-2
elif generator-object-1 <  generator-object-2
        then read-next-row-generator-object-1

在Python中有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

我过去曾用过这个:

import operator

def mergeiter(*iterables, **kwargs):
    """Given a set of sorted iterables, yield the next value in merged order"""
    iterables = [iter(it) for it in iterables]
    iterables = {i: [next(it), i, it] for i, it in enumerate(iterables)}
    if 'key' not in kwargs:
        key = operator.itemgetter(0)
    else:
        key = lambda item, key=kwargs['key']: key(item[0])

    while True:
        value, i, it = min(iterables.values(), key=key)
        yield value
        try:
            iterables[i][0] = next(it)
        except StopIteration:
            del iterables[i]
            if not iterables:
                raise

如果输入的iterables本身已经排序,这将按排序顺序列出给定iterables中的项目。

上面的生成器将以与伪代码相同的顺序迭代你的两个生成器。

答案 1 :(得分:0)

没有太多更好的方法......

go1 = next(generator1)
go2 = next(generator2)

try:
    while True
        if go1 == go2:
           go1 = next(generator1)
           go2 = next(generator2)
        elif go1 > go2:
           go2 = next(generator2)
        elif go1 < go2:
           go1 = next(generator1)
except StopIteration
    pass #Done now ...

当然,你在这里描述的实际上是合并排序的合并阶段(或者至少看起来是这样) - 尽管在一个生成器耗尽之后你不会产生其余的对象。 CPython的内置排序非常类似(Tim-sort是插入排序和合并排序的混合)。所以,在这种情况下,如果你不介意最后有一个列表,你可以这样做:

import itertools as it
sorted(it.chain(generator1,generator2))

鲍勃是你的叔叔。