6

オブジェクトのタイプに関係なく、2 つの配列のようなオブジェクト (たとえばlist、s、tuples、またはs) の内容を比較する必要がある場合は、次を使用します。collection.deque

list(an_arrayish) == list(another_arrayish)

これを達成するためのより慣用的な/より高速な/より良い方法はありますか?

4

3 に答える 3

4

要素ごとに比較します。

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代わりに使用します

于 2012-08-27T01:25:58.567 に答える
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
于 2012-08-27T01:25:38.953 に答える
0

タプルとリストは、対応する要素の比較を使用して辞書的に比較されます。これは、等しいと比較するには、各要素が等しい必要があり、2 つのシーケンスが同じ型で同じ長さでなければならないことを意味します。

他のいくつかの言語で使用されている「ここでの等価性は、これらの参照がメモリ内の同じオブジェクトを参照しているかどうかをテストしていることを意味します」という規則に実行されていないことを確認すると、==等価性テストに固執することがこれを達成するための最も簡単な方法であると言えます。したがって最高。

于 2012-08-27T01:22:52.030 に答える