如何检查两个列表是否相同?

时间:2019-02-28 21:14:33

标签: python

我正在尝试比较Python中的两个列表,检查它们是否相同。问题在于两个列表都可以包含重复元素,并且为了被认为相等,它们需要具有相同数量的重复元素。

我目前通过创建两个列表的副本并在两个列表相等的情况下从其中删除一个元素来“解决”此问题:

def equals(v1: Vertex, v2: Vertex) -> bool:
    # also checks if neighbourhoods are the same size
    if v1.label == v2.label:

        # copy the neighbourhoods to prevent data loss on removal of checked vertices
        v1_neighbours = v1.neighbours.copy()
        v2_neighbours = v2.neighbours.copy()

        # for every Vertex in v1.neighbours, check if there is a corresponding Vertex in v2.neighbours
        # if there is, remove that Vertex from both lists
        for n1 in v1_neighbours:
            for n2 in v2_neighbours:
                if n1.label == n2.label:
                    v1_neighbours.remove(n1)
                    v2_neighbours.remove(n2)
                    break
                else:
                    return False

        if len(v1_neighbours) == 0 and len(v2_neighbours) == 0:
            return True

    return False

我怀疑该解决方案是否有效:List.remove(element)是否会删除该元素的所有出现?另外,我不认为它的内存效率很高,这很重要,因为邻居会很大。

谁能告诉我如何正确比较v1_neighboursv2_neighbours,在不更改列表的情况下检查等量的重复项,而不复制列表?

2 个答案:

答案 0 :(得分:3)

Count them并比较反对意见:

a= [ (x,y) for x in range(5) for y in range(5)]+[ (x,y) for x in range(3) for y in range(3)]
b= [ (x,y) for x in range(5) for y in range(5)]+[ (x,y) for x in range(3) for y in range(3)]
c= [ (x,y) for x in range(5) for y in range(5)]+[ (x,y) for x in range(4) for y in range(3)]

from collections import Counter

ca = Counter(a)
cb = Counter(b)
cc = Counter(c)

print(ca==cb)    # True
print(ca==cc)    # False
print(ca)

输出:

True
False

Counter({(0, 0): 2, (0, 1): 2, (0, 2): 2, (1, 0): 2, (1, 1): 2, (1, 2): 2, 
         (2, 0): 2, (2, 1): 2, (2, 2): 2, (0, 3): 1, (0, 4): 1, (1, 3): 1, 
         (1, 4): 1, (2, 3): 1, (2, 4): 1, (3, 0): 1, (3, 1): 1, (3, 2): 1, 
         (3, 3): 1, (3, 4): 1, (4, 0): 1, (4, 1): 1, (4, 2): 1, (4, 3): 1, 
         (4, 4): 1})

答案 1 :(得分:2)

虽然collections.Counter是在Python中执行这种多集比较的常用方法,但我认为比较邻居是从根本上误导了顶点相等性测试的方法。顶点相等应根据程序的详细信息使用默认的基于身份的相等或基于标签的相等。

您似乎正在尝试进行比较,如果两个顶点具有相等的标签和相等的邻居集合,则两个顶点相等。但是,如果两个不同的顶点可能具有相等的标签,则两个不同的顶点应该具有相同的标签和相同的邻居,这将是一个破损的相等比较。如果两个顶点不可能具有相等的标签,则不需要比较邻居。

您的邻居比较嵌套循环还假设如果标签相等,则顶点相等,从而进一步支持基于标签的比较。如果这个假设是错误的,那么您将面临如何确定邻居相等的问题。如果您尝试将邻居与==进行比较,则会遇到无限递归。


通过进一步澄清您正在实现颜色优化算法,我们可以确认仅按标签比较邻居实际上是正确的。但是,equals似乎是您正在实现的函数的一个误导性名称,因为您没有测试给定的Vertex对象是否代表相同的顶点。