2

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

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 中有没有更好的方法?

4

2 回答 2

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

这将按排序顺序列出给定迭代中的项目,前提是输入迭代本身已经排序。

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

于 2013-04-02T15:54:03.077 回答
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))

鲍勃是你的叔叔。

于 2013-04-02T15:52:35.967 回答