当我必须比较两个类似数组的对象的内容时——例如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)
有没有更惯用/更快/更好的方法来实现这一目标?
逐元素比较:
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
元组和列表使用对应元素的比较按字典顺序进行比较。这意味着要比较相等,每个元素必须比较相等,并且两个序列必须是相同的类型并且具有相同的长度。
看到我们没有遇到约定,其他一些语言使用“这里的平等意味着我们正在测试这些引用是否引用内存中的同一个对象”我会说坚持==
平等测试是实现这一目标的最简单方法并且因此最好。