提问人:a276me 提问时间:6/15/2021 最后编辑:a276me 更新时间:6/16/2021 访问量:566
比较列表的内容,忽略顺序
Comparing contents of lists ignoring order
问:
假设我有一个如下所示的类:
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 是相同的?
答:
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
评论
(OBJ(0) == OBJ(0)) is False