python-3.x - 如何比较嵌套结构?

标签 python-3.x algorithm

我想比较两个嵌套结构,比如比较 [[[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

请随意将其扩展到其他结构,例如 dictset

如果类型很重要,但不重要,你可以使用这个变体,它将保留每个列表项的 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/

相关文章:

python - 替代 __del__ 来获得最终结果并终止类中的进程?

algorithm - 如何实现推荐引擎?

html - 使用 alpha channel 绘制重叠的圆圈

arrays - 有效删除 Ruby 数组中其他元素的所有子字符串

algorithm - 如何在绝对灰度图像中而不是在二进制图像中检测直线?

algorithm - 定点数学比 float 快吗?

python-3.x - 使用 "deployment targets"创建堆栈实例时出现 boto3 错误

python-3.x - import cv2 在命令提示符下不会给出错误,但在 Windows 10、Python 3.6.4 上的 IDLE 上会出错

python - 将字符串拆分为 x 个字符

python-3.x - 如何在 Pandas DataFrame 的 apply() 中使用 DateTimeIndex 作为命名函数的输入