繁体   English   中英

带有一个 function 的列表嵌套字典的顶级长度

[英]Top level length of nested dictionaries of lists with one function

我有一个包含列表的嵌套字典,需要获取字典中每个顶级值中所有列表的长度总和。 示例列表如下:

data = {0: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        1: {0: [11, 12],
            1: {0: [13, 14],
                1: [15, 16],
                2: [17, 18, 19, 20],
                3: {0: [43, 34],
                    1: [4],
                    2: [2, 3, 4, 5]}}}}

我相信我有一个使用以下两个功能的工作解决方案:

def TreeSum(tree):
    return [len(v) if isinstance(v, list) else SubTreeSum(v) for v in tree.values()]

def SubTreeSum(tree):
    return sum([len(v) if isinstance(v, list) else SubTreeSum(v) for v in tree.values()])

TreeSum(data)的 output 是[10, 17]TreeSum(data[1][1])[2, 2, 4, 7]

我曾尝试将这些功能组合成一个 function,主要是出于美观原因,但我还没有找到解决方案。 有人可以建议解决该问题的方法吗?

您只需要:

def TreeSum(tree):
    return [len(v) if isinstance(v, list) else sum(TreeSum(v)) for v in tree.values()]

您可以区分运行顶级 function 和递归调用的情况:

def TreeSum(tree, agg=False):
    l =  [len(v) if isinstance(v, list) else TreeSum(v, True) for v in tree.values()]
    return sum(l) if agg else l

output:

>>> TreeSum(data)
[10, 17]

一个不传递行为改变标志的简单解决方案是只创建SubTreeSum并嵌套 function 的TreeSum 瞧,单身 function:

def TreeSum(tree):
    def SubTreeSum(tree):
        return sum([len(v) if isinstance(v, list) else SubTreeSum(v) for v in tree.values()])

    return [len(v) if isinstance(v, list) else SubTreeSum(v) for v in tree.values()]

也许更漂亮的方法是将通用功能剥离到另一个嵌套的 function 中以避免代码重复:

def TreeSum(tree):
    def SubTreeList(tree):
        return [len(v) if isinstance(v, list) else SubTreeSum(v) for v in tree.values()]

    def SubTreeSum(tree):
        return sum(SubTreeList(tree))

    return SubTreeList(tree)

您可以通过使用字典键或列表值作为迭代驱动程序并计算 1(对于列表项)或长度列表的递归总和(对于字典)来在单个递归 function 中执行此操作:

def topCounts(C):
    return [1 if type(C) is list else sum(topCounts(C[k])) for k in C]

Output:

data = {0: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        1: {0: [11, 12],
            1: {0: [13, 14],
                1: [15, 16],
                 2: [17, 18, 19, 20],
                 3: {0: [43, 34], 1: [4], 2: [2, 3, 4, 5]}}}}
    
print(topCounts(data))
print(topCounts(data[1][1]))

[10, 17]
[2, 2, 4, 7]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM