列表列表与另一列表相比较

时间:2016-03-21 16:06:27

标签: python python-2.7

我试图找到类似这样的东西

l1 = [1,[1,1]]
l2 = [2,[2,2]]

由于列表中的列表序列对于l1等于l2

都是相同的
l3 = [1,1,[1,1]]
l4 = [2,[2,2],2]

这里由于列表序列不相同,因此l3不等于l4

编辑:

l1在索引1处具有长度为2的列表,类似于l2因此等于。

l3在index = 2处有一个长度为2的列表,但l4在index = 1处有长度为2的列表,与l3不同,因此不相等

如果已经有类似的东西,请指出我正确的方向。 如果没有,那么如何继续这样做。 我正在考虑将内部列表的长度与它们的索引存储在外部列表中的行,然后比较两者。由于这对于大型阵列来说非常冗长,我正在寻求您的建议。 感谢

PS:我是Python的初学者

1 个答案:

答案 0 :(得分:1)

这个程序可能会做你想要的:

def f(lst):
    return [type(x) for x in lst]

l1 = [1,[1,1]]
l2 = [2,[2,2]]
l3 = [1,1,[1,1]]
l4 = [2,[2,2],2]
l5 = [1,1,[1,1]]
l6 = [2,2,[2,2,2]]

assert f(l1) == f(l2)
assert f(l3) != f(l4)
assert f(l5) == f(l6)

编辑:

此程序可在空间和时间内有效地运行很长的列表。它也适用于任意深度的列表。

from itertools import izip_longest

def compare_shape(list1, list2):
    '''Compare the "shape" of two lists, ignoring the contents.'''

    # Use generators to save memory
    def shape(l):
        '''Flatten list to a series of tokens, [, ], or 0.'''
        if isinstance(l, list):
            yield '['
            for x in l:
                for y in shape(x):
                    yield y
            yield ']'
        else:
            yield 0

    # Use all() to save time.
    # Use izip to save memory
    # Use izip_longest to ensure correct answer if list1 is a prefix of list2
    return all(a == b
               for a,b in izip_longest(shape(list1),
                                       shape(list2), 
                                       fillvalue=object()))

l1 = [1,[1,1]]
l2 = [2,[2,2]]
l3 = [1,1,[1,1]]
l4 = [2,[2,2],2]
l5 = [1,1,[1,1]]
l6 = [2,2,[2,2,2]]

assert compare_shape(l1, l2)
assert not compare_shape(l3, l4)
assert not compare_shape(l5,l6)