比较两个类似列表对象的内容的最佳方法是什么?

时间:2012-08-27 01:14:07

标签: python polymorphism idioms

当我必须比较两个类似数组的对象的内容时 - 例如list s,tuple s或collection.deque s - 而不考虑对象的类型,我用

list(an_arrayish) == list(another_arrayish)

有没有更惯用/更快/更好的方法来实现这一目标?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:0)

  

使用字典比较词典和列表进行比较   相应的元素。这意味着要比较相等的每个元素   必须比较相等,两个序列必须是相同的类型和   长度相同。

看到我们没有遇到惯例,其他一些语言使用“相等”意味着我们正在测试这些引用是否引用了内存中的同一个对象“我会说坚持==相等性测试是最简单的方法,因此是最好的。