2014-01-26 39 views
1

你好,我想要一个名单与Python的另一个列表,其中的元素序列好好尝试一下事项Python的元组进行比较

list=[1,2,3] 

应等于list2=[3,2,1]和等于list3=[3,1,2]等。我想动态地这样做,因为我不知道列表中有多少元素?有没有快速的方法来做到这一点?我想出的唯一方法是在每个列表中搜索另一个列表的元素,但这有O(n^2)。此外,我无法排序列表,因为在我的实施中,列表是列表的列表。我只想回答简单版本的问题,然后修改它!你可以帮我吗?

+1

不幸的是,最简单的解决办法可能_still_是与内部列表进行排序一个自定义的排序键。 –

+0

你可能也想看看这个:http://stackoverflow.com/questions/21029678/undirected-tuple-comparison – fedorSmirnov

回答

4

您可以将列表简单地转换成集,然后简单地检查它们是否相等

list1, list2, list3 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4] 
print set(list1) == set(list2) # True 
print set(list2) == set(list3) # False 
print set(list1) == set(list3) # False 

如果你想确保元素只存在相同数量的倍于其他列表中,你可以使用collections.counterThanks @delnan),这样

list1, list2, list3, list4 = [1, 2, 3], [2, 3, 1], [1, 2, 3, 4], [1, 2, 3, 3] 
from collections import Counter 
print Counter(list1) == Counter(list2) # True 
print Counter(list2) == Counter(list3) # False 
print Counter(list1) == Counter(list3) # False 
print Counter(list1) == Counter(list4) # False 
+2

这不起作用,如果他试图[1,2,3]与[1, 2,3,3] –

+1

@ NG。很难说,也许它确实是OP想要的。如果不是,'collections.Counter'也可以。 – delnan

+0

@NG。我没有任何重复的东西,所以它会工作! Thx的答案我会尽快标记! – JmRag

2

如果列表都不允许有重复的元素:

def list_eql(x, y): 
    return sorted(x) == sorted(y) 

如果列表中没有重复的元素:

def list_eql(x, y): 
    return set(x) == set(y) 

编辑:我明白你的问题xy是列出的名单。 在这种情况下set解决方案将无法正常工作(因为列表是可变的),你将需要内部列表第一转换为元组:

def list_eql(x, y): 
    return set(map(tuple, x)) == set(map(tuple, y)) 
+2

如果列表有重复,只检查两个列表的长度将不起作用。 考虑列表x = [1,1,2,2,3],y = [1,1,1,2,3]。即使这两个列表不相等,你的函数也会返回true。 –

+0

@ sk4x0r:很好,我已经编辑了我的答案,谢谢。 –