Python - 与大小不等的2个列表的diff-like顺序比较,

时间:2014-05-23 14:47:26

标签: python list dataset

我想比较两个列表并检查,如果元素的顺序相同:

a = [e, f, g, h, i]
b = [e, f, h, i, j, g]

我知道以下方法,但这仅适用于相同大小的列表:

[i for i, j in zip(a, b) if i == j]

如何显示两个列表之间的差异?正如我所说,我不是在谈论交叉(仅)因为订单也很重要。

我尝试存档输出,如:

a, b
e, e OK
f, f OK
g, h NOK
h, i NOK
i, j NOK
null, g NOK

是否有任何内置功能,至少是按照描述的方式区分2组?

3 个答案:

答案 0 :(得分:2)

您可以使用itertools.izip_longest(请注意,这在Python 3.x中已重命名为zip_longest):

 [i for i, j in izip_longest(a, b) if i == j]

一旦较短的itertable耗尽,izip_longest将使用输入的任何内容作为fillvalue关键字参数(在此None中,因为我们没有提供参数)。< / p>

修改

如果您希望输出与原始问题中的输出相匹配,则可以执行以下操作:

>>> print("\n".join(["{}, {} {}OK".format(i, j, "" if i == j else "N") for i, j in izip_longest(a, b, fillvalue="null")]))
e, e OK
f, f OK
g, h NOK
h, i NOK
i, j NOK
null, g NOK

答案 1 :(得分:1)

您可以使用枚举并添加较长列表中的元素。

a = ["e", "f", "g", "h", "i"]
b = ["e", "f", "h", "i", "j", "g"]

m_len = len(min(a, b))
mx = max(a, b)
d = [[a[i], b[i], "Ok"] if a[i] == b[i] else [ a[i], b[i],"NOK"] for i, j in enumerate(min(a, b))]
d += [["null", x, "NOK"] for x in mx[m_len:]]
print "a" ," b"
for i,j,k in d:
    print('{}, {} {}'.format(i, j, k))


a  b
e, e Ok
f, f Ok
g, h NOK
h, i NOK
i, j NOK
null, g NOK

答案 2 :(得分:1)

我正在为此添加第二个答案,因为这是一种非常不同的方法......

如果您想要真正类似差异的功能,可以使用difflib。例如:

>>> for x in difflib.unified_diff(a, b, lineterm=""): print(x)
... 
--- 
+++ 
@@ -1,5 +1,6 @@
 e
 f
-g
 h
 i
+j
+g

>>> for x in difflib.ndiff(a, b): print(x)
... 
  e
  f
- g
  h
  i
+ j
+ g

根据您提供的示例输出,我不确定这是否真的是您想要的,但只是让您知道它存在。