我想比较两个元组列表:
larry = [(1,'a'), (2, 'b')]
moe = [(2, 'b'), (1, 'a')]
这样列表中项目的顺序可能不同。 有库函数吗?
>> deep_equals(larry, moe)
True
答案 0 :(得分:6)
如果我理解你,你的元组代表集合,你的列表代表集合。显而易见的事情是将它们转换为集合:
def setterific(l):
return frozenset(frozenset(p) for p in l)
setterific(larry) == setterific(moe)
这使用了frozensets,因为在python中不能有一组集合(因为集合是可变的);见How can I create a Set of Sets in Python?。
如果您只有一个级别的集合,请使用frozenset(larry) == frozenset(moe)
。
答案 1 :(得分:4)
如果您关心的是最外层列表中的项目顺序(除了“深层”这个词之外的所有内容对我而言 - 它本身就会让我对您的意思产生怀疑),并且您知道如果没有重复项,您可以使用set
。
>>> larry = [(1,'a'), (2, 'b')]
>>> moe = [(2, 'b'), (1, 'a')]
>>> set(larry) == set(moe)
True
如果案例与这两个元组一样简单,您还可以使用dict
,即{1: 'a', 2: 'b'}
。这可能是也可能不是一个更方便的结构。无论如何,dict(larry) == dict(moe)
的比较将做你想要的。
如果您关心重复项,则需要更多工作,复制列表并逐个删除项目,直到失败或一个为空。