【问题标题】:How do I perform deep equality comparisons of two lists of tuples?如何对两个元组列表进行深度相等比较?
【发布时间】:2012-03-10 17:31:39
【问题描述】:

我想比较两个元组列表:

larry = [(1,'a'), (2, 'b')]
moe = [(2, 'b'), (1, 'a')]

使得列表中项目的顺序可能不同。 是否有库函数可以做到这一点?

>> deep_equals(larry, moe)
True

【问题讨论】:

    标签: python


    【解决方案1】:

    如果我理解你,你的元组代表集合,你的列表代表集合。显而易见的事情是将它们转换为集合:

    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)

    【讨论】:

    • 元组不代表集合。它们是有序的 SMTP 标头。
    • @BonAmi:您的问题含糊不清,这就是为什么其他答案已经解决了我遇到的相同情况。
    【解决方案2】:

    如果你只关心最外层列表中项目的顺序(除了“深”这个词之外的所有东西都向我暗示——它让我对你的意思产生怀疑),你知道没有重复,您可以使用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) 的比较会做你想做的事。

    如果你关心重复,这将需要更多的工作,复制列表并一个接一个地拉出项目,直到它失败或一个是空的。

    【讨论】:

    • 不会有任何重复的可能。
    • 那么我想这就是你想要的?
    猜你喜欢
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2021-10-10
    • 2015-10-19
    • 2017-09-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多