2014-05-23 56 views
0

我想比較兩個列表和檢查,如果這些元素在同一順序差異樣定購的對比:的Python - 2只列出有大小不等,

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

我知道下面的方法,但僅適用於相同尺寸的清單:

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

如何顯示diff-like兩個列表之間的差異?正如我所說,我不是在談論交叉(僅),因爲訂單也很重要。

我試圖存檔等的輸出:

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

有可能任何內置的功能,至少對於中所描述的方式版本比較2套?

回答

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,因爲我們沒有提供參數)。

編輯:

如果你想匹配你在你原來的問題的輸出,你可以這樣做:

>>> 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 
+0

丟掉'fillvalue',用'None'更好我猜 – thefourtheye

+0

@thefourtheye是的,公平點。 – dano

+0

此外,這隻篩選所有匹配的數據:) – thefourtheye

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 
+0

我不得不承認這個是非常酷的,謝謝! – royskatt

+0

實際上,它給出了一個錯誤,當列表有不同的尺寸: 回溯(最近通話最後一個): 文件 「/home/myhome/listvalidate.py」 38行,在 diff_list(des_filelist,dir_list) 文件「/home/myhome/listvalidate.py」,第30行,在diff_list中 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))] IndexError:列表索引超出範圍 – royskatt

+0

您應該不會收到索引錯誤,因爲它列舉了最短列表。a和b在示例 –

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 

我不知道這是否是你真正想要的東西,給你提供的示例輸出,但只是讓你知道它的存在。

+0

非常感謝您展示Python函數和方法的可能性! – royskatt