我没有找到具体问题的答案。我搜索带有for循环的嵌套字典的标准方法不太适合我,因为我对这些字典有各种不同的结构(所有这些都在这个字典中!)。一些词典比其他词典更深入,并且具有不同的键名。
所以我喜欢拥有与SQL类似的东西。因此,对于第一个键,我想在此dict结构中提取特定子键的值,而不知道其结构(以便知道此键的位置和是否存在)。
我需要类似的东西:
data=nested_dict
[value for key, value in data.items() WHERE key.name="name"]
或者另一种方式仅仅是提取键(级别)的“位置”?
答案 0 :(得分:1)
您的示例代码似乎与您要实现的内容的措辞描述不匹配。
无论如何,您编写的代码几乎是有效的。在这种情况下,SQL WHERE语句的Python类似物是带有
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")
希望我能帮助您。 :)
干杯, 西拉斯