搜索嵌套字典中的特定子项

时间:2018-06-20 19:19:27

标签: python dictionary

我没有找到具体问题的答案。我搜索带有for循环的嵌套字典的标准方法不太适合我,因为我对这些字典有各种不同的结构(所有这些都在这个字典中!)。一些词典比其他词典更深入,并且具有不同的键名。

所以我喜欢拥有与SQL类似的东西。因此,对于第一个键,我想在此dict结构中提取特定子键的值,而不知道其结构(以便知道此键的位置和是否存在)。

我需要类似的东西:

data=nested_dict
[value for key, value in data.items() WHERE key.name="name"]

或者另一种方式仅仅是提取键(级别)的“位置”?

1 个答案:

答案 0 :(得分:1)

您的示例代码似乎与您要实现的内容的措辞描述不匹配。 无论如何,您编写的代码几乎是有效的。在这种情况下,SQL WHERE语句的Python类似物是带有语句的 list理解

data = {
  "key_1": {
    "name": "Alice",
    "age": 21
  },
  "key_2": {
    "name": "Bob",
    "hobbies": ["cryptography", "tennis"]
  }
}
# Extract the first value in data that contains a key 'name' with the value 'Bob'
value = [v for v in data.values() if v["name"] == "Bob"][0]
assert value == {"name": "Bob", "hobbies": ["cryptography", "tennis"]}

当然,如果 data 包含任何没有键“ name” 的子命令,这将引发 KeyError 异常。要解决这个问题,只需使用:

data_with_name = [v for v in data.values() if "name" in v]
value = [v for v in data_with_name.values() if v["name"] == "Bob"][0]

如果数据包含的值不是子命令,则此代码可能仍会引发 TypeError 异常,因此您可能要使用:

data_with_name = [v for v in data.values() if isinstance(v, dict) and "name" in v]

您还可以使用 dict理解过滤掉所有满足特定条件的子字典:

data_called_bob = {k: v for k, v in data_with_name.items() if v["name"] == "Bob"}

如果Bob可能在嵌套的dict中隐藏了 deep ,并且您想提取包含kv对(“ name”,“ Bob”)< / em>在任意深层次上,请使用递归:

def find_sub_dict(data, key, value):
  if isinstance(data, dict) and key in data and data[key] == value:
    return data
  elif not isinstance(data, dict):
    return None
  else:
    for v in data.values():
      result = find_sub_dict(v, key, value)
      if result is not None:
        return result

value = find_sub_dict(data, "name", "Bob")

希望我能帮助您。 :)

干杯, 西拉斯