當我有兩個陣列狀物體的內容比較 - list
S,tuple
S或collection.deque
S代表實例 - 無需爲對象的類型方面,我使用比較兩個類列表對象的內容的最佳方法是什麼?
list(an_arrayish) == list(another_arrayish)
有什麼更習慣/更快/更好的方式來實現這一目標?
當我有兩個陣列狀物體的內容比較 - list
S,tuple
S或collection.deque
S代表實例 - 無需爲對象的類型方面,我使用比較兩個類列表對象的內容的最佳方法是什麼?
list(an_arrayish) == list(another_arrayish)
有什麼更習慣/更快/更好的方式來實現這一目標?
比較它的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
代替
元組和列表按照字典順序使用 相應元素的比較進行比較。這意味着爲了比較相等,每個元素 必須相等並且兩個序列必須是相同類型並且具有相同長度。
看到,我們現在還沒有遇到公約其他一些語言使用的「平等在這裏表示,如果這些引用指向同一個對象在內存中,我們正在測試」我想說與==
相等測試是堅持最簡單的方法來實現這一點,因此是最好的。
Python中存在其他語言的'==',其形式爲'is'。 – Erik
@erik這是真的。我沒有爭辯說它不是,簡單地說,對於引用變量,Python的'=='行爲不像其他語言那樣編寫像'my_java_string.equals(your_java_string);'這樣的代碼。因爲我們有這個(IMO)較好的'=='行爲,所以我的投票將繼續使用它來描述你所描述的情況。 – chucksmash
@Eric:>其他語言的==確實存在於Python中,形式是<這是不正確的。給定兩個列表l1和l2,Python的'只是'測試只測試l1和l2是否通過測試其內存地址來測試相同的對象。所以'l1是l2'只有在l1和l2佔據相同的地址時才返回True。 ''l1 == l2'確實存在於Python中,但是執行了不同的功能。通過定義'__eq__'方法來定義它,取決於個人課程 –
元組似乎更快:
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
任何機會把標題改爲「什麼是最快的方式......」?將這兩個列表作爲元組來增加內存的使用,我從來沒有見過這是一種慣用的方法。 –
我會改變它以尋求最好的方式,因爲我對最快的閱讀方式同樣感興趣。 – Erik