使用一次后,Differ.compare()的结果消失

时间:2015-12-15 11:31:25

标签: python difflib

我试图通过使用python中compare(a,b)中定义的Differdifflib方法的结果来描述两个字符串之间的差异。我以下列方式使用compare(a,b)

s1 = ["one",  "three", "twoo"]
s2 = ["one",  "tow", "tree"]
d = difflib.Differ()
result = d.compare(s1, s2)

# without this for loop, the result is as expected
for r in result:
    print(r)

desc = describe_diff(result)
for k, value in desc.items():
    print(k, value)

我的问题是当我将result传递给我创建的函数describe_diff之前,结果是错误的。但是当我注释掉打印result的for循环时,输出就可以了。我尝试使用两个for循环一个接一个地打印result,但它只打印一次。但是,当我在两个循环之间插入compare(s1,s2)时(或者在打印循环和我的describe_diff函数调用之间),一切都很好。因此,为了多次使用result的值,我每次都必须执行compare方法吗?必须有一些方法来解决这个问题。请帮忙。

1 个答案:

答案 0 :(得分:2)

那是因为compare为你提供了一个生成器对象,它在迭代一次之后会耗尽。如果要多次使用结果,可以将生成器强制转换为列表。

一次迭代后,生成器将为空:

>>> from difflib import Differ
>>> s1 = ["one",  "three", "twoo"]
>>> s2 = ["one",  "tow", "tree"]
>>> result = Differ().compare(s1, s2)
>>> result
<generator object compare at 0x7f017de9f1b0>
>>> for x in result:
...     pass
... 
>>> list(result)
[]

将生成器强制转换为列表(在迭代之前):

>>> result = Differ().compare(s1, s2)
>>> list(result)
['  one', '+ tow', '- three', '?  -\n', '+ tree', '- twoo']

请注意,将生成器强制转换为列表后,它将再次耗尽:

>>> result = Differ().compare(s1, s2)
>>> foo = list(result) # foo is now ['  one', '+ tow', '- three', '?  -\n', '+ tree', '- twoo']
>>> list(result)
[]