我试图通过使用python中compare(a,b)
中定义的Differ
类difflib
方法的结果来描述两个字符串之间的差异。我以下列方式使用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
方法吗?必须有一些方法来解决这个问题。请帮忙。
答案 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)
[]