我正在测试difflib如何为每个字符区分一些随机输入而工作,并且惊讶地发现以下内容:
考虑一个片段:
import difflib
a = """kydropqfp
tpssubdbw tzibqyqvp llmpwtekn xmubmrjch vcojgxxil
vdrsqhzag xlcldqabb ujccweoha dsooqyyve khilgzjue
jignrbela glvvueqqb qlfehmlkm brkleswiq vvsplffjf
yjuoivyjr wtfueypmo pkvlmbcnh tesuistya zbf"""
blist = list(a)
blist[23] = 'a'
b = ''.join(blist)
print('\n'.join(difflib.unified_diff(a, b)))
它提供了预期的结果:
---
+++
@@ -21,7 +21,7 @@
t
z
i
-b
+a
q
y
q
但是,如果我们在输入的末尾只添加一个n
字符:
a = """kydropqfp
tpssubdbw tzibqyqvp llmpwtekn xmubmrjch vcojgxxil
vdrsqhzag xlcldqabb ujccweoha dsooqyyve khilgzjue
jignrbela glvvueqqb qlfehmlkm brkleswiq vvsplffjf
yjuoivyjr wtfueypmo pkvlmbcnh tesuistya zbfn"""
然后,由于某种原因,找到差异之后的上下文不限于3个字符:
---
+++
@@ -21,184 +21,184 @@
t
z
i
-b
-q
-y
-q
-v
-p
-
-l
-l
-m
-p
-w
-t
-e
-k
-n
-
-x
-m
-u
-b
-m
-r
-j
-c
-h
-
-v
-c
-o
-j
-g
-x
-x
-i
-l
-
-v
-d
-r
-s
-q
-h
-z
-a
-g
-
-x
-l
-c
-l
-d
-q
-a
-b
-b
-
-u
-j
-c
-c
-w
-e
-o
-h
-a
-
-d
-s
-o
-o
-q
-y
-y
-v
-e
-
-k
-h
-i
-l
-g
-z
-j
-u
-e
-
-j
-i
-g
-n
-r
-b
-e
-l
-a
-
-g
-l
-v
-v
-u
-e
-q
-q
-b
-
-q
-l
-f
-e
-h
-m
-l
-k
-m
-
-b
-r
-k
-l
-e
-s
-w
-i
-q
-
-v
-v
-s
-p
-l
-f
-f
-j
-f
-
-y
-j
-u
-o
-i
-v
-y
-j
-r
-
-w
-t
-f
-u
-e
-y
-p
-m
-o
-
-p
-k
-v
-l
-m
-b
-c
-n
-h
-
-t
-e
-s
-u
-i
-s
-t
-y
-a
-
-z
-b
-f
-n
+a
+q
+y
+q
+v
+p
+
+l
+l
+m
+p
+w
+t
+e
+k
+n
+
+x
+m
+u
+b
+m
+r
+j
+c
+h
+
+v
+c
+o
+j
+g
+x
+x
+i
+l
+
+v
+d
+r
+s
+q
+h
+z
+a
+g
+
+x
+l
+c
+l
+d
+q
+a
+b
+b
+
+u
+j
+c
+c
+w
+e
+o
+h
+a
+
+d
+s
+o
+o
+q
+y
+y
+v
+e
+
+k
+h
+i
+l
+g
+z
+j
+u
+e
+
+j
+i
+g
+n
+r
+b
+e
+l
+a
+
+g
+l
+v
+v
+u
+e
+q
+q
+b
+
+q
+l
+f
+e
+h
+m
+l
+k
+m
+
+b
+r
+k
+l
+e
+s
+w
+i
+q
+
+v
+v
+s
+p
+l
+f
+f
+j
+f
+
+y
+j
+u
+o
+i
+v
+y
+j
+r
+
+w
+t
+f
+u
+e
+y
+p
+m
+o
+
+p
+k
+v
+l
+m
+b
+c
+n
+h
+
+t
+e
+s
+u
+i
+s
+t
+y
+a
+
+z
+b
+f
+n
有没有人对这种行为有解释?
答案 0 :(得分:0)
在Python 2.7.10中,我在print('\n'.join(difflib.unified_diff(a, b)))
和print('\n'.join(difflib.unified_diff(b, a)))
之间得到了截然不同的结果(a
和b
交换过来了:
>>> a = """kydropqfp
... tpssubdbw tzibqyqvp llmpwtekn xmubmrjch vcojgxxil
... vdrsqhzag xlcldqabb ujccweoha dsooqyyve khilgzjue
... jignrbela glvvueqqb qlfehmlkm brkleswiq vvsplffjf
... yjuoivyjr wtfueypmo pkvlmbcnh tesuistya zbfn"""
>>> print('\n'.join(difflib.unified_diff(a, b)))
---
+++
@@ -21,7 +21,7 @@
t
z
i
-b
+a
q
y
q
@@ -201,4 +201,3 @@
z
b
f
-n
>>> print('\n'.join(difflib.unified_diff(b, a)))
---
+++
@@ -21,183 +21,184 @@
t
z
i
-a
-q
-y
-q
-v
-p
-
-l
-l
-m
-p
-w
-t
-e
-k
-n
-
-x
-m
-u
-b
-m
-r
-j
-c
-h
-
-v
-c
-o
-j
-g
-x
-x
-i
-l
-
-v
-d
-r
-s
-q
-h
-z
-a
-g
-
-x
-l
-c
-l
-d
-q
-a
-b
-b
-
-u
-j
-c
-c
-w
-e
-o
-h
-a
-
-d
-s
-o
-o
-q
-y
-y
-v
-e
-
-k
-h
-i
-l
-g
-z
-j
-u
-e
-
-j
-i
-g
-n
-r
-b
-e
-l
-a
-
-g
-l
-v
-v
-u
-e
-q
-q
-b
-
-q
-l
-f
-e
-h
-m
-l
-k
-m
-
-b
-r
-k
-l
-e
-s
-w
-i
-q
-
-v
-v
-s
-p
-l
-f
-f
-j
-f
-
-y
-j
-u
-o
-i
-v
-y
-j
-r
-
-w
-t
-f
-u
-e
-y
-p
-m
-o
-
-p
-k
-v
-l
-m
-b
-c
-n
-h
-
-t
-e
-s
-u
-i
-s
-t
-y
-a
-
-z
-b
-f
+b
+q
+y
+q
+v
+p
+
+l
+l
+m
+p
+w
+t
+e
+k
+n
+
+x
+m
+u
+b
+m
+r
+j
+c
+h
+
+v
+c
+o
+j
+g
+x
+x
+i
+l
+
+v
+d
+r
+s
+q
+h
+z
+a
+g
+
+x
+l
+c
+l
+d
+q
+a
+b
+b
+
+u
+j
+c
+c
+w
+e
+o
+h
+a
+
+d
+s
+o
+o
+q
+y
+y
+v
+e
+
+k
+h
+i
+l
+g
+z
+j
+u
+e
+
+j
+i
+g
+n
+r
+b
+e
+l
+a
+
+g
+l
+v
+v
+u
+e
+q
+q
+b
+
+q
+l
+f
+e
+h
+m
+l
+k
+m
+
+b
+r
+k
+l
+e
+s
+w
+i
+q
+
+v
+v
+s
+p
+l
+f
+f
+j
+f
+
+y
+j
+u
+o
+i
+v
+y
+j
+r
+
+w
+t
+f
+u
+e
+y
+p
+m
+o
+
+p
+k
+v
+l
+m
+b
+c
+n
+h
+
+t
+e
+s
+u
+i
+s
+t
+y
+a
+
+z
+b
+f
+n
>>>
difflib
有strange parts。使用的算法是一个旧的,试图“看起来很好”,但显然有些情况下它不起作用。我没有查看代码告诉你为什么它的行为是这样的,但我希望这能告诉你内置的difflib
是好的,但不是最好的。不幸的是,似乎没有受支持的alternatives。