我想比较两个列表并检查,如果元素的顺序相同:
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组?
答案 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
根据您提供的示例输出,我不确定这是否真的是您想要的,但只是让您知道它存在。