【问题标题】:python dynamic object querypython动态对象查询
【发布时间】:2016-10-04 04:11:37
【问题描述】:

我有一个 Python 对象,其结构如下:

tree = {
    "a": {
        "aa": {
            "aaa": {},
            "aab": {},
            "aac": {}
        },
        "ab": {
            "aba": {},
            "abb": {}
        }
    },
    "b": {
        "ba": {}
    },
    "c": {}
}

还有一组字符串列表,例如:

arr_1 = ["a", "ab"]
arr_2 = ["b", "ab"]
arr_3 = ["a", "ab", "aba"]

每个列表都定义了树中键的路径,我想确定该列表是否描述了通过树的有效路径。

目前我可以像这样逐案回答:

tree[arr_1[0]][arr_1[1]] # Returns correct object
tree[arr_2[0]][arr_2[1]] # Returns error
tree[arr_3[0]][arr_3[1]][arr_3[2]] # Returns correct object

虽然这不能满足我的要求。我更喜欢一个函数,它可以在树中搜索任何给定列表中的键。

以下函数几乎是我想要的,但它不能处理不同长度的列表。

def is_valid(tree, arr):
    obj = tree[arr[0]][arr[1]]
    if len(obj) > 0:
        return(obj)
    else:
        return("No obj")

目前这个函数输出

is_valid(tree, arr_1) # Returns the correct result
is_valid(tree, arr_2) # Returns an error
is_valid(tree, arr_3) # Returns the same result as arr_1, which is incorrect

谁能帮我扩展这个函数以动态响应arr 参数的长度?

谢谢!

【问题讨论】:

  • 首先,您的“字典集”实际上是“str 列表”。第二次尝试使用for key in arr: 循环遍历is_valid 中的键。第三,不确定这是硬件还是用例,但如果可以,您可以尝试创建一个实际的树并进行搜索。

标签: python arrays object dictionary


【解决方案1】:

我认为最简单的方法是利用递归。每个子树都是树,每个子路径都是路径,所以我们可以查看路径中的第一个元素是否有效,然后从那里继续。

def is_valid(tree, path):

    # base case. Any path would be valid for any tree
    if len(path) == 0:
        return True

    # the path must be invalid, no matter what comes before or after
    if not path[0] in tree:
        return False

    # look at the rest
    return is_valid(tree[path[0]], path[1:])

如果您想要路径描述的子树,您可以这样做:

def is_valid(tree, path):

    if len(path) == 0:
        return tree # the only difference
    if not path[0] in tree:
        return False
    return is_valid(tree[path[0]], path[1:])

【讨论】:

  • 谢谢!太完美了!
  • 如果它回答了您的问题,如果您接受了答案,我将不胜感激。很高兴我能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多