我想比较两个嵌套结构,比如比较 [[[1],[2],[3]],[2],3]
和 [1,'a' ,[[[1]],['abc','d']]]
。怎么办?
最佳答案
从您的评论来看,列表中元素的类型和数量似乎都不重要,重要的是列表本身的“嵌套结构”。因此,您可以递归地从列表中删除不是另一个嵌套列表的所有内容,然后比较剩下的内容。
def purge(lst):
return [purge(x) for x in lst if isinstance(x, list)]
a = [[[1],[2],[3]],[2],3]
b = [1,'a',[[[1]],['abc','d']]]
purge(a)
# [[[], [], []], []]
purge(b)
# [[[[]], []]]
purge(a) == purge(b)
# False
请随意将其扩展到其他结构,例如 dict
和 set
。
如果类型很重要,但不重要,你可以使用这个变体,它将保留每个列表项的 type
,但折叠相同的连续条目(注意这也是如何折叠 [7]、[8]、[9]
到 [int]
,第一个版本除外):
import itertools
def purge2(lst):
tmp = [purge2(x) if isinstance(x, list) else type(x).__name__ for x in lst]
return [k for k, g in itertools.groupby(tmp)]
c = [[[1,2,3],["a","b"],4,[5,6]],[7],[8],[9]]
purge2(c)
# [[['int'], ['str'], 'int', ['int']], ['int']]
请注意,您不能通过这种方式直接比较“已清除”列表,至少如果一个空列表应该与包含任何内容的列表匹配则不能。为此,您将需要另一种递归比较方法。
相反,您也可以定义一个函数,保留除列表结构之外的所有内容,也许您也可以使用它来进行其他比较...
def leafs(lst):
return [x for y in lst
for x in (leafs(y) if isinstance(y, list) else [y])]
leafs(a)
# [1, 2, 3, 2, 3]
leafs(b)
# [1, 'a', 1, 'abc', 'd']
关于python-3.x - 如何比较嵌套结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57114519/