1

我试图通过使用python中定义compare(a,b)的类方法的结果来描述两个字符串之间的差异。我以以下方式使用。Differdifflibcompare(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但是当我注释掉打印的for循环时,result输出就可以了。我试过result一个接一个地打印 using 两个 for 循环,但它只打印一次。compare(s1,s2)但是,当我在两个循环之间(或在打印循环和我的函数调用之间)插入in 时,describe_diff一切都很好。result那么要多次使用的值,我必须compare每次都执行该方法吗?一定有办法解决这个问题。请帮忙。

4

1 回答 1

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)
[]
于 2015-12-15T11:37:55.093 回答