Python 检查两个无序列表是否相等
我正在寻找一种简单(快速)的方法来确定两个无序的列表是否包含相同的元素: 例如:Python 检查两个无序列表是否相等,python,list,comparison,Python,List,Comparison,我正在寻找一种简单(快速)的方法来确定两个无序的列表是否包含相同的元素: 例如: ['one', 'two', 'three'] == ['one', 'two', 'three'] : true ['one', 'two', 'three'] == ['one', 'three', 'two'] : true ['one', 'two', 'three'] == ['one', 'two', 'three', 'three'] : false ['one', 'two', 'three'
['one', 'two', 'three'] == ['one', 'two', 'three'] : true
['one', 'two', 'three'] == ['one', 'three', 'two'] : true
['one', 'two', 'three'] == ['one', 'two', 'three', 'three'] : false
['one', 'two', 'three'] == ['one', 'two', 'three', 'four'] : false
['one', 'two', 'three'] == ['one', 'two', 'four'] : false
['one', 'two', 'three'] == ['one'] : false
我希望不使用映射就可以做到这一点。Python有一个内置的数据类型,用于无序的(可散列的)事物集合,称为
集。如果将两个列表都转换为集合,则比较将是无序的
set(x) == set(y)
编辑:@mdwhatcott指出您要检查重复项set
忽略这些,因此您需要一个类似的数据结构来跟踪每个列表中的项目数。这被称为;标准库中的最佳近似值为:
您希望查看它们是否包含相同的元素,但不关心顺序
sum([1 for i,j in zip(a,b) if i==j])
您可以使用一个集合:
>>> set(['one', 'two', 'three']) == set(['two', 'one', 'three'])
True
但是set对象本身只包含每个唯一值的一个实例,并且不会保留顺序
>>> set(['one', 'one', 'one']) == set(['one'])
True
因此,如果跟踪重复项/长度很重要,您可能还需要检查长度:
def are_eq(a, b):
return set(a) == set(b) and len(a) == len(b)
如果元素总是像您的示例中那样近似排序,那么内置的.sort()
()应该很快:
>>> a = [1,1,2]
>>> b = [1,2,2]
>>> a.sort()
>>> b.sort()
>>> a == b
False
如果您不想就地排序,可以使用
实际上,对于.sort()
,它可能总是比collections.Counter()更快(尽管渐近O(n)
时间比O(n*log(n))更好)。测量它;如果它很重要。如果您不想使用“收藏”库,则始终可以执行以下操作:
假设a
和b
是您的列表,下面返回匹配元素的数量(它考虑顺序)
所以,
len(a)==len(b) and len(a)==sum([1 for i,j in zip(a,b) if i==j])
如果两个列表相同,包含相同的元素且顺序相同,则将为True
<代码>错误
否则
因此,您可以像上面的第一个响应那样定义比较函数,但不需要集合库
compare = lambda a,b: len(a)==len(b) and len(a)==sum([1 for i,j in zip(a,b) if i==j])
及
从此处复制:
我认为这是这个问题的最佳答案,因为
这比使用中指出的计数器要好
x、 sort()对x进行排序,这是一个副作用。排序(x)返回一个新列表
上述问题的一个简单答案是:-
让这两个列表分别为list1和list2,
您的要求是确保两个列表是否具有相同的元素,那么根据我的说法,以下是最佳方法:-
if ((len(list1) == len(list2)) and
(all(i in list2 for i in list1))):
print 'True'
else:
print 'False'
上述代码将根据您的需要工作,即列表1的所有元素是否都在列表2中,反之亦然
但是,如果您只想检查list1的所有元素是否都存在于list2中,那么您只需要使用以下代码段:-
if all(i in list2 for i in list1):
print 'True'
else:
print 'False'
区别在于,如果list2包含一些额外的元素以及list1的所有元素,则后者将打印True。简单地说,它将确保list1的所有元素都应该出现在list2中,而不管list2是否有一些额外的元素。假设您已经知道列表的大小相等,当且仅当两个向量完全相同(包括顺序)时,以下内容才保证为真
例如:
>>> from functools import reduce
>>> def compvecs(a,b):
... return reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, a, b), True)
...
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compvecs(a=[1,2,3,4], b=[1,2,3,4])
True
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compare_vectors(a=[1,2,3,4], b=[1,2,2,4])
False
>>>
获取列表的字符串表示形式并进行比较怎么样
>>> l1 = ['one', 'two', 'three']
>>> l2 = ['one', 'two', 'three']
>>> l3 = ['one', 'three', 'two']
>>> print str(l1) == str(l2)
True
>>> print str(l1) == str(l3)
False
注意:因为使用set()会删除重复项,所以对于提供的第三个示例,此解决方案将返回True而不是False。如果您不关心重复项,这是最好的答案。如果您想检查它们是否具有相同的元素,那么Suhail的答案是最好的。如果您在这里结束是因为有两个看起来相同但计算结果不相等的集合(如我所做的),请检查这些对象的\uuuuu hash\uuuu
函数,以验证相等的对象具有相同的哈希值。我的没有。+1好的一点,我没有注意到!另一方面,仅仅检查长度是不够的(否则,[1,1,2]=[1,2,2]
)--你必须计算所有对象的总数。如果你想检查相同的元素(包括重复的元素),的下推([1,2,2],[1,1,2])==True
的下推(的下推,的下推([1,1,2]),这些解决方案(甚至最后一个)都不起作用([1,2,2],[1,1,2])==True
sorted(a)==sorted(b)
是我认为这里最干净的方法。我认为这个答案应该是公认的答案。我认为这个答案不正确,因为调用sort()
列表中的项目可能会改变其顺序,如果我们对两个列表进行比较,结果会不同,这是不可接受的。@Reorx:为什么要进行向下投票?您是否阅读过:“如果不想在原地排序,可以使用sorted()在回答中?@J.F.Sebastian很抱歉忽略了这些话,但我认为一个好的答案应该是明确的,直接告诉读者什么是解决问题的最佳方式,而不仅仅是提供一个有争议的方式和一个可有可无的解释使用.sort()
和sorted()
。谢谢:)@Reorx:如果可以的话,最好的方法是就地排序:它避免创建不必要的副本。这并不总是可取的,因此提到了sorted()
。如果您不知道它的作用,请单击链接。这是两个无序列表。def same(list1,list2):返回((len(list1)==len(list2))和(all(list2中的i代表list1中的i));相同((1,1,2),(1,2,2))
(在o(n)空间中这样做而不修改输入看起来是一个挑战。)添加['one','one','two']==['one','two','two']
。@TedKleinBergman他们提供了属性,他们没有复制另一个答案,他们将有用的(+19)注释转换成了答案。这很有价值。这是真实的答案-它可以处理不可损坏的列表元素。set()
有时不是答案(大小、重复…).好吧,尽管如此-雷蒙德的回答值得一读:-有些东西,比如dict
s,是不可排序的。。。
if all(i in list2 for i in list1):
print 'True'
else:
print 'False'
functools.reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, listA, ListB), True)
>>> from functools import reduce
>>> def compvecs(a,b):
... return reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, a, b), True)
...
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compvecs(a=[1,2,3,4], b=[1,2,3,4])
True
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compare_vectors(a=[1,2,3,4], b=[1,2,2,4])
False
>>>
>>> l1 = ['one', 'two', 'three']
>>> l2 = ['one', 'two', 'three']
>>> l3 = ['one', 'three', 'two']
>>> print str(l1) == str(l2)
True
>>> print str(l1) == str(l3)
False