比较列表的内容,忽略顺序

Comparing contents of lists ignoring order

提问人:a276me 提问时间:6/15/2021 最后编辑:a276me 更新时间:6/16/2021 访问量:566

问:

假设我有一个如下所示的类:

class OBJ:
    def __init__(self, a):
        self.A = a

我有 2 个这些对象的列表

# sorry this is a bad example, plz look at the bottom
a = [OBJ(1), OBJ(0), OBJ(20), OBJ(-1)]
b = [OBJ(20), OBJ(-1), OBJ(1), OBJ(0)]

如何证明这两个列表的内容相同? 我尝试使用 sorted() 方法,但它似乎不起作用,因为您无法在逻辑上比较 2 个对象。有没有人有一种快速有效的方法来解决这个问题?谢谢!

编辑: 对不起,这 2 个列表是一个不好的例子。当我的意思相同时,我的意思是它们都指的是同一个对象。所以:

a = OBJ(1)
b = OBJ(-1)
c = OBJ(20)

x = [a,b,c]
y = [c,a,b]

如何证明 X 和 Y 是相同的?

Python 列表 相等性

评论

1赞 ForceBru 6/15/2021
内容“相同”是什么意思?使用您发布的代码,(OBJ(0) == OBJ(0)) is False
0赞 a276me 6/15/2021
对不起,我的意思是它们应该引用同一个对象,我已经编辑了这个问题
0赞 Tom McLean 6/15/2021
您的意思是引用相同的对象,还是对象具有相同的输入?我编辑了我的答案,包括您是否要检查它们是否指向完全相同的对象。

答:

3赞 Tom McLean 6/15/2021 #1

您需要实现 and 方法,以便对对象进行排序,然后进行比较:__eq____lt__

class OBJ:
    def __init__(self, a):
        self.A = a
    
    def __eq__(self, other): 
        if not isinstance(other, OBJ):
            # don't attempt to compare against unrelated types
            return NotImplemented

        return self.A == other.A
    
    def __lt__(self, other):
         return self.A < other.A

a = [OBJ(1), OBJ(0), OBJ(20), OBJ(-1)]
b = [OBJ(20), OBJ(-1), OBJ(1), OBJ(0)]

测试:

sorted(a) == sorted(b)
Output: True

编辑:

问题中的注释使您想要检查对象是否完全相同,而不仅仅是相同的输入。为此,只需查看它们是否指向相同的对象id()

例:

a = OBJ(1)
b = OBJ(-1)
c = OBJ(20)

x = [a,b,c]
y = [c,a,b]
sorted([id(temp) for temp in x]) == sorted([id(temp) for temp in y])
Output: True

然而。。。

a = OBJ(1)
b = OBJ(-1)
c = OBJ(20)
d = OBJ(20) # Same input value as c, but a different object

x = [a,b,c]
y = [d,a,b]
sorted([id(temp) for temp in x]) == sorted([id(temp) for temp in y])
Output: False
1赞 will-hedges 6/15/2021 #2

您可以比较 2 个基于您的属性的备用列表:sorted()A

>>>print(sorted([o.A for o in a]) == sorted([o.A for o in b]))
True