2012-08-27 104 views
6

當我有兩個陣列狀物體的內容比較 - list S,tuple S或collection.deque S代表實例 - 無需爲對象的類型方面,我使用比較兩個類列表對象的內容的最佳方法是什麼?

list(an_arrayish) == list(another_arrayish) 

有什麼更習慣/更快/更好的方式來實現這一目標?

+1

任何機會把標題改爲「什麼是最快的方式......」?將這兩個列表作爲元組來增加內存的使用,我從來沒有見過這是一種慣用的方法。 –

+0

我會改變它以尋求最好的方式,因爲我對最快的閱讀方式同樣感興趣。 – Erik

回答

4

比較它的elementwise:

def compare(a,b): 
    if len(a) != len(b): 
     return False 
    return all(i == j for i,j in itertools.izip(a,b)) 

對於Python 3.x中,使用zip代替

+2

使用上面的基準,這給出了大約9-10秒的時間。 – Ryan

+2

@minitech這是預料之中的,因爲Python循環明顯比C循環慢得多。但它永遠不會炸燬你的內存,因爲它不需要像tuple/list方法那樣將存儲量加倍。另外,對於不同大小的列表(或者在第一個項目中不同的列表)會更好。 – JBernardo

+0

minitech:在我的機器上比較兩個100萬個項目列表需要200ms。我不確定你在做什麼,這是很長的。 –

0

元組和列表按照字典順序使用 相應元素的比較進行比較。這意味着爲了比較相等,每個元素 必須相等並且兩個序列必須是相同類型並且具有相同長度。

看到,我們現在還沒有遇到公約其他一些語言使用的「平等在這裏表示,如果這些引用指向同一個對象在內存中,我們正在測試」我想說與==相等測試是堅持最簡單的方法來實現這一點,因此是最好的。

+1

Python中存在其他語言的'==',其形式爲'is'。 – Erik

+1

@erik這是真的。我沒有爭辯說它不是,簡單地說,對於引用變量,Python的'=='行爲不像其他語言那樣編寫像'my_java_string.equals(your_java_string);'這樣的代碼。因爲我們有這個(IMO)較好的'=='行爲,所以我的投票將繼續使用它來描述你所描述的情況。 – chucksmash

+0

@Eric:>其他語言的==確實存在於Python中,形式是<這是不正確的。給定兩個列表l1和l2,Python的'只是'測試只測試l1和l2是否通過測試其內存地址來測試相同的對象。所以'l1是l2'只有在l1和l2佔據相同的地址時才返回True。 ''l1 == l2'確實存在於Python中,但是執行了不同的功能。通過定義'__eq__'方法來定義它,取決於個人課程 –

3

元組似乎更快:

tuple(an_arrayish) == tuple(another_arrayish) 

這裏有一個快速的基準:

>>> timeit.Timer('list(a) == list(b)', 'a, b = (1, 2, 3, 4, 5), (1, 2, 3, 4, 6)').timeit() 
2.563981056213379 
>>> timeit.Timer('list(a) == list(b)', 'a, b = [1, 2, 3, 4, 5], [1, 2, 3, 4, 6]').timeit() 
2.4739551544189453 
>>> timeit.Timer('tuple(a) == tuple(b)', 'a, b = (1, 2, 3, 4, 5), (1, 2, 3, 4, 6)').timeit() 
1.3630101680755615 
>>> timeit.Timer('tuple(a) == tuple(b)', 'a, b = [1, 2, 3, 4, 5], [1, 2, 3, 4, 6]').timeit() 
1.475499153137207 
相關問題