a = [1, 2, 3, 1, 2, 3]
b = [3, 2, 1, 3, 2, 1]

A和b应该被认为是相等的,因为它们有完全相同的元素,只是顺序不同。

问题是,我的实际列表将由对象(我的类实例)组成,而不是整数。


当前回答

你可以对两者进行排序:

sorted(a) == sorted(b)

计数排序也可能更有效(但它要求对象是可哈希的)。

>>> from collections import Counter
>>> a = [1, 2, 3, 1, 2, 3]
>>> b = [3, 2, 1, 3, 2, 1]
>>> print (Counter(a) == Counter(b))
True

其他回答

你可以对两者进行排序:

sorted(a) == sorted(b)

计数排序也可能更有效(但它要求对象是可哈希的)。

>>> from collections import Counter
>>> a = [1, 2, 3, 1, 2, 3]
>>> b = [3, 2, 1, 3, 2, 1]
>>> print (Counter(a) == Counter(b))
True

如果你必须在测试中这样做: https://docs.python.org/3.5/library/unittest.html#unittest.TestCase.assertCountEqual

assertCountEqual(first, second, msg=None)

测试第一个序列是否包含与第二个序列相同的元素,而不管它们的顺序如何。当它们不这样做时,将生成一个错误消息,列出序列之间的差异。

在比较第一个和第二个元素时,不会忽略重复的元素。它验证两个序列中每个元素的计数是否相同。等价于:assertEqual(Counter(list(first)), Counter(list(second))),但也适用于不可哈希对象的序列。

3.2新版功能。

在2.7中: https://docs.python.org/2.7/library/unittest.html#unittest.TestCase.assertItemsEqual

在测试之外,我会推荐Counter方法。

如果你知道项目总是可哈希的,你可以使用Counter(),它是O(n) 如果你知道这些项总是可排序的,你可以使用sorted()也就是O(n log n)

一般情况下,你不能依赖于排序能力,或者拥有元素,所以你需要一个像这样的后备方案,不幸的是,它是O(n²)

len(a)==len(b) and all(a.count(i)==b.count(i) for i in a)

如果列表中包含不可哈希的项(比如对象列表),你可以使用Counter类和id()函数,比如:

from collections import Counter
...
if Counter(map(id,a)) == Counter(map(id,b)):
    print("Lists a and b contain the same objects")

我希望下面的代码可能在你的情况下工作:-

if ((len(a) == len(b)) and
   (all(i in a for i in b))):
    print 'True'
else:
    print 'False'

这将确保两个列表a和b中的所有元素都是相同的,无论它们的顺序是否相同。

为了更好的理解,请参考我对这个问题的回答