オブジェクトのタイプに関係なく、2 つの配列のようなオブジェクト (たとえばlist
、s、tuple
s、またはs) の内容を比較する必要がある場合は、次を使用します。collection.deque
list(an_arrayish) == list(another_arrayish)
これを達成するためのより慣用的な/より高速な/より良い方法はありますか?
オブジェクトのタイプに関係なく、2 つの配列のようなオブジェクト (たとえばlist
、s、tuple
s、またはs) の内容を比較する必要がある場合は、次を使用します。collection.deque
list(an_arrayish) == list(another_arrayish)
これを達成するためのより慣用的な/より高速な/より良い方法はありますか?
要素ごとに比較します。
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
代わりに使用します
タプルの方が速いようです:
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
タプルとリストは、対応する要素の比較を使用して辞書的に比較されます。これは、等しいと比較するには、各要素が等しい必要があり、2 つのシーケンスが同じ型で同じ長さでなければならないことを意味します。
他のいくつかの言語で使用されている「ここでの等価性は、これらの参照がメモリ内の同じオブジェクトを参照しているかどうかをテストしていることを意味します」という規則に実行されていないことを確認すると、==
等価性テストに固執することがこれを達成するための最も簡単な方法であると言えます。したがって最高。