2014-11-06 93 views
0

我有2所列出:有效的测试,如果两个列表有相同的元素和长度

alist = ['A','B','C','D'] 
anotherList = ['A','C','B','D'] 

想编写返回True如果两个列表包含完全相同的元素,相同长度的函数。我对这个东西有点新,所以我得到了这个,我非常肯定它很糟糕,我试图找到一个更有效的方法。谢谢!

def smyFunction(aList,anotherList): 
    n = 0 
    for element in aList: 
     if element in anotherList: 
      n = n+1 
    if n == len(aList): 
     return True 
    else: 
     return False 

回答

1

排序与sorted,然后列出与==对它们进行比较:

>>> alist = ['A','B','C','D'] 
>>> anotherList = ['A','C','B','D'] 
>>> def smyFunction(aList,anotherList): 
...  return sorted(aList) == sorted(anotherList) 
... 
>>> smyFunction(alist, anotherList) 
True 
>>> 

您需要首先进行排序的情况下,元素为顺序:

>>> alist = ['A','B','C','D'] 
>>> anotherList = ['D','A','C','B'] 
>>> alist == anotherList 
False 
>>> sorted(alist) == sorted(anotherList) 
True 
>>> 

其实,最好先测试一下列表的长度,然后用sorted

return len(alist) == len(anotherList) and sorted(alist) == sorted(anotherList) 

这样一来,我们就能避免排序操作如果列表的长度不同,以开始(使用len名单上有O(1)(恒定)的复杂性,所以这是很便宜)。

+0

不要忘记首先测试两个列表的长度为提高速度,当两个列表的大小不同。 – 2014-11-06 20:02:44

+0

@StevenRumbalski - 好主意。我会执行它。 – iCodez 2014-11-06 20:13:57

4

浮现在脑海中的两种方法是:

1)使用collections.Counter

>>> from collections import Counter 
>>> Counter(alist) == Counter(anotherList) 
True 

2)比较排序列表

>>> sorted(alist) == sorted(anotherList) 
True 
+0

'计数器'解决方案很好,因为它是线性的O(n)而不是O(n log n)。 – 2014-11-06 19:28:35

+1

@JohnKugelman - 对于较小的列表,“排序”解决方案的速度很快*。运行一个简单的'timeit'测试可以为'Counter'产生'36.708395899478845','sorted'则产生'3.7142343510138858'。我只会建议使用'Counter'作为大型列表。 – iCodez 2014-11-06 19:34:03

+0

@iCodez在没有重复的情况下,使用它会更快,返回set(alist)== set(anotherList)? – MarcSM23 2014-11-06 20:02:46

0

如果没有重复,使用set,它没有订单:

set(alist) == set(anotherList) 
+0

-0。设置不起作用,因为'set([1,2,3,])== set([1,1,2,3])'。 – 2014-11-06 19:40:52

+0

@StevenRumbalski:不需要急,请*阅读*我的答案。 – 2014-11-06 19:45:34

+0

够公平的。我仍然偏爱使用'sorted'或'Counter',因为它可以工作,不管是否有重复。 – 2014-11-06 19:54:25

0

尝试这样的:

def check(a,b): 
    return sorted(a) == sorted(b) 
相关问题