【问题标题】:Filtering out Python Dictionary Values with Array of Nested Keys使用嵌套键数组过滤 Python 字典值
【发布时间】:2017-06-07 16:07:20
【问题描述】:

我正在尝试从 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...]

但是,如果键是嵌套的,我该怎么做? IE。 ['user']['color']?

如何向该数组添加嵌套键?我试过了: [user][color]['user']['color']'user]['color,它们都不对 :) 我需要的许多值都是嵌套字段。我怎样才能在这个数组中添加一个嵌套键并且仍然有 new = {k:data[k] for k in FIELDS if k in data} 位工作?

【问题讨论】:

  • 它们都具有相同的“深度”吗?
  • 没有,有些只有 1 深,有些只有 2 或 3 深。 @WillemVanOnsem
  • 从扁平化字典和压缩键 stackoverflow.com/questions/6027558/… 开始。然后,选择包含任何FIELDS标签的键。

标签: python arrays dictionary filter


【解决方案1】:

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

'findValue' 将拆分给定对象中的 searchKey(此处为点),如果找到它会在以下值中搜索下一个“子键”(假设它是一个字典/对象)...

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

【讨论】:

    【解决方案2】:

    创建一个递归函数来检查字典键是否有值或字典。 如果键有字典再次调用函数,直到找到非字典值。 当您找到价值时,只需将其添加到新创建的字典中即可。

    希望这会有所帮助。

    【讨论】:

    • 什么是嵌套函数
    • 抱歉它是递归的,不是嵌套的。感谢指正
    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 2012-06-25
    • 2020-05-23
    • 2014-03-30
    相关资源
    最近更新 更多