使用嵌套键数组过滤Python字典值

3

我正在尝试从Python字典中过滤出一些值。基于这里的答案:Filter dict to contain only certain keys。我正在做类似于以下的操作:

new = {k:data[k] for k in FIELDS if k in data}

基本上创建一个new字典,只关心FIELDS数组中列出的键。我的数组看起来像:

FIELDS = ["timestamp", "unqiueID",etc...]

然而,如果键是嵌套的,该如何处理呢?例如:['user']['color']?
我该如何在此数组中添加一个嵌套的键?我尝试过以下几种方法:[user][color]['user']['color']'user]['color,但都不正确 :) 我需要许多嵌套字段的值。如何在此数组中添加一个嵌套键,并确保new = {k:data[k] for k in FIELDS if k in data}仍然能够正常工作?

它们都有相同的“深度”吗? - Willem Van Onsem
不是全部都只有一层,还有些是两层或三层深度的。@WillemVanOnsem - HectorOfTroy407
1
开始先将字典展平并压缩键 https://dev59.com/fm025IYBdhLWcg3wZlLd。然后选择包含任何 FIELDS 标签的键。 - DYZ
2个回答

1

一个非常简单的方法,可能看起来如下所示(它不适用于所有可能性 - 列表/数组中的对象)。您只需要指定一个“格式”,以便查找嵌套值。

如果找到了“searchKey”(这里是点),则“findValue”将在给定对象中拆分它,并搜索以下值中的下一个“子键”(假设它是字典/对象)...

myObj = {
    "foo": "bar",
    "baz": {
        "foo": {
            "bar": True
        }
    }
}

def findValue(obj, searchKey):
    keys = searchKey.split('.')

    for i, subKey in enumerate(keys):
        if subKey in obj:
            if i == len(subKey) -1:
                return obj[subKey]
            else:
                obj = obj[subKey]
        else:
            print("Key not found: %s (%s)" % (subKey, keys))
            return None

res = findValue(myObj, 'foo')
print(res)

res = findValue(myObj, 'baz.foo.bar')
print(res)

res = findValue(myObj, 'cantFind')
print(res)

返回:
bar
True
Key not found: cantFind (cantFind)
None

-1
创建一个递归函数,检查字典键是否具有值或字典。 如果键再次具有字典,则调用函数直到找到非字典值为止。 当您找到值时,将其添加到新创建的字典中。
希望这对您有所帮助。

嵌套函数是什么? - DYZ
抱歉,我之前说错了,它是递归的,而不是嵌套的。谢谢你的纠正。 - Jay Parikh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接