当我有两个阵列状物体的内容比较 - 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