我试图找到类似这样的东西
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的初学者
答案 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)