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

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

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


当前回答

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

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

其他回答

让a b列出来

def ass_equal(a,b):
try:
    map(lambda x: a.pop(a.index(x)), b) # try to remove all the elements of b from a, on fail, throw exception
    if len(a) == 0: # if a is empty, means that b has removed them all
        return True 
except:
    return False # b failed to remove some items from a

不需要将它们设置为可哈希或排序。

你可以对两者进行排序:

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

您可以编写自己的函数来比较这些列表。

让我们得到两个列表。

list_1=['John', 'Doe'] 
list_2=['Doe','Joe']

首先,我们定义一个空字典,计数列表项并写入字典。

def count_list(list_items):
    empty_dict={}
    for list_item in list_items:
        list_item=list_item.strip()
        if list_item not in empty_dict:
            empty_dict[list_item]=1
        else:
            empty_dict[list_item]+=1
    return empty_dict


        

之后,我们将使用下面的函数比较两个列表。

def compare_list(list_1, list_2):
    if count_list(list_1)==count_list(list_2):
        return True
    return False
compare_list(list_1,list_2)

O(n): Counter()方法是最好的(如果你的对象是可哈希的):

def compare(s, t):
    return Counter(s) == Counter(t)

O(n log n): sorted()方法是次优方法(如果你的对象是可排序的):

def compare(s, t):
    return sorted(s) == sorted(t)

O(n * n):如果对象既不是可哈希的,也不是可排序的,你可以使用相等:

def compare(s, t):
    t = list(t)   # make a mutable copy
    try:
        for elem in s:
            t.remove(elem)
    except ValueError:
        return False
    return not t

如果你知道项目总是可哈希的,你可以使用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)