2012-08-27 75 views
6

当我有两个阵列状物体的内容比较 - list S,tuple S或collection.deque S代表实例 - 无需为对象的类型方面,我使用比较两个类列表对象的内容的最佳方法是什么?

list(an_arrayish) == list(another_arrayish) 

有什么更习惯/更快/更好的方式来实现这一目标?

+1

任何机会把标题改为“什么是最快的方式......”?将这两个列表作为元组来增加内存的使用,我从来没有见过这是一种惯用的方法。 –

+0

我会改变它以寻求最好的方式,因为我对最快的阅读方式同样感兴趣。 – Erik

回答

4

比较它的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代替

+2

使用上面的基准,这给出了大约9-10秒的时间。 – Ryan

+2

@minitech这是预料之中的,因为Python循环明显比C循环慢得多。但它永远不会炸毁你的内存,因为它不需要像tuple/list方法那样将存储量加倍。另外,对于不同大小的列表(或者在第一个项目中不同的列表)会更好。 – JBernardo

+0

minitech:在我的机器上比较两个100万个项目列表需要200ms。我不确定你在做什么,这是很长的。 –

0

元组和列表按照字典顺序使用 相应元素的比较进行比较。这意味着为了比较相等,每个元素 必须相等并且两个序列必须是相同类型并且具有相同长度。

看到,我们现在还没有遇到公约其他一些语言使用的“平等在这里表示,如果这些引用指向同一个对象在内存中,我们正在测试”我想说与==相等测试是坚持最简单的方法来实现这一点,因此是最好的。

+1

Python中存在其他语言的'==',其形式为'is'。 – Erik

+1

@erik这是真的。我没有争辩说它不是,简单地说,对于引用变量,Python的'=='行为不像其他语言那样编写像'my_java_string.equals(your_java_string);'这样的代码。因为我们有这个(IMO)较好的'=='行为,所以我的投票将继续使用它来描述你所描述的情况。 – chucksmash

+0

@Eric:>其他语言的==确实存在于Python中,形式是<这是不正确的。给定两个列表l1和l2,Python的'只是'测试只测试l1和l2是否通过测试其内存地址来测试相同的对象。所以'l1是l2'只有在l1和l2占据相同的地址时才返回True。 ''l1 == l2'确实存在于Python中,但是执行了不同的功能。通过定义'__eq__'方法来定义它,取决于个人课程 –

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 
相关问题