在Python中将列表与省略号进行比较

时间:2017-11-09 00:45:46

标签: python python-3.x list comparison ellipsis

有没有办法比较在Python中引用自己的列表?你可以看到我在下面尝试过的内容:

In[65]:  b
Out[65]: [[...]]

In[66]:  a
Out[66]: [[[[...]]]]

In[67]:  a==b

Traceback (most recent call last):

  File "<ipython-input-67-67c639108cf0>", line 1, in <module>
    a==b

RecursionError: maximum recursion depth exceeded in comparison

我可以理解它不能永远进入列表,但仍然有办法比较具有省略号的列表吗?

[编辑]:

如何创建a

a=[]
a.append(a)
a=[[[a]]]

如何创建b

b=[]
b.append(b)
b=[b]

1 个答案:

答案 0 :(得分:2)

使用all和一个基于列表理解的生成器,我们可以实现一个compare函数,该函数适用于我能发现的每种情况:

def compare(list1: list, list2: list, root1=None, root2=None):
    """Compare recursively nested lists."""
    root1, root2 = (root1, root2) if root1 and root2 else (list1, list2)
    return len(list1) == len(list2) and all(
        ((a, b) == (root1, root2) or a == b)
        and compare(list1[i + 1:], list2[i + 1:], root1, root2)
        for i, (a, b) in enumerate(zip(list1, list2)))

示例

为便于理解,我将按照打印时显示的列表来编写列表,而不是使用appends不断构建它们。

a, b = ([[...]], [[...]])
compare(a, b)
>>> True

a, b = ([[...], 2], [[...]])
compare(a, b)
>>> False

a, b = ([2, [...], 2], [[...]])
compare(a, b)
>>> False

a, b = ([2, [...], 2], [2, [...], 2])
compare(a, b)
>>> True

a, b = ([2, [...], [2]], [2, [...], [3]])
compare(a, b)
>>> False

如果您想让我测试并添加更多案例,我会很乐意这样做。