我需要比较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中有更好的方法吗?
答案 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))
鲍勃是你的叔叔。