【问题标题】:How to filter values in my generator expression如何过滤生成器表达式中的值
【发布时间】:2018-06-20 23:01:33
【问题描述】:

我下面的函数是计算嵌套字典的深度。

#!/usr/bin/env python3

def get_dict_depth(d, depth=0):
    if not isinstance(d, dict) or not d:
        return depth   
    return max(get_dict_depth(v, depth+1) if k != 'id' else depth for k, v in d.items())

foobar = {
        "key1" : "val1",
        "key2" : {
            "id" : "val2"
            },
        "new_d" : {
            "key" : "val",
            "key2" : {
                "id" : "blabla",
                "key" : {
                    "id" : "blabla",
                    }
                },
            }
        }

depth = get_dict_depth(foobar)
print("Depth %d" % depth)

我想将其修改为在深度计算中不包括具有值id 的键。如果我在生成器表达式中使用三元组,程序就可以工作:

return max(get_dict_depth(v, depth+1) if k != 'id' else depth for k, v in d.items())

但我似乎无法通过过滤使其工作:

return max(get_dict_depth(v, depth+1) for k, v in d.items() if k != 'id')

为什么我的过滤器不工作,我该如何让它工作?

【问题讨论】:

  • 我不清楚你所说的 “我想修改它以不包括在深度计算中具有值 id 的键”。你能详细说明吗?也许添加一个例子?
  • 使用三元有什么问题?
  • 您能否将生成器表达式转换为生成器函数,并将表达式 expanded 转换为常规 for 循环,并将其包含在帖子中?它可能会说明问题。
  • @Ev.Kounis 当前字典的深度为 4。但是,我不希望包含最后一个 id,所以它应该计算为 3
  • @pault 三元没有错。我只是想了解过滤器的工作原理以及如何正确使用它们

标签: python dictionary list-comprehension conditional-operator generator-expression


【解决方案1】:

将支票移至您的 get_dict_depth 函数:

def get_dict_depth(d, depth=0):
    if not isinstance(d, dict) or not d or 'id' in d:
        return depth
    return max(get_dict_depth(v, depth+1) for v in d.values())

这给了我结果:

Depth 2

【讨论】:

  • 但是深度是 3。应该是foobar['new_d']['key2']['key']。但除此之外,我更感兴趣的是了解过滤器是如何工作的,或者为什么它在我的实例中不起作用。
猜你喜欢
  • 2016-10-12
  • 2021-12-23
  • 2022-12-03
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多