从嵌套dict-python中获取键值



我有一个带有嵌套字典数据对象的类。我需要从中获取所有的关键值。什么是最有效的方法?

我被以下内容卡住了:

for k,v in data.items():
print v.keys()

这是数据:

data = {
"BANK": {
"no_data": "INT",
},
"SHOCK": {
"drop": "NOTI",
"rise": "NOTI",
"high_risk": "ALERT",
},
"OFFLINE": {"online": None, "offline_few": "ALERT"},
}

将列表(value.keys()列表(连接为一个列表的一种优雅方法是使用双循环列表压缩,如下所示:

nested_keys = [
key
for val in data.values()
for key in val.keys()]

使用生成器:

def all_keys(d):
for k, v in d.items():
yield k
# assume that anything with `items` property will be a mapping
# this can be replaced with: `isinstance(v, dict)` or `isinstance(v, collections.Mapping)`
if hasattr(v, 'items'):  
yield from all_keys(v)

根据您的输入,这将产生:

data = {
"BANK": {
"no_data": "INT",
},
"SHOCK": {
"drop": "NOTI",
"rise": "NOTI",
"high_risk": "ALERT",
},
"OFFLINE": {"online": None, "offline_few": "ALERT"},
}
print(list(all_keys(data)))
# ['BANK', 'no_data', 'SHOCK', 'drop', 'rise', 'high_risk', 'OFFLINE', 'online', 'offline_few']

如果所有"实际"键值对都在某个深度,例如深度1,则可以执行以下操作:

data = {
"BANK": {
"no_data": "INT",
},
"SHOCK": {
"drop": "NOTI",
"rise": "NOTI",
"high_risk": "ALERT",
},
"OFFLINE": {"online": None, "offline_few": "ALERT"},
}
dic = {k:v for val in data.values() for k,v in val.items()}

但如果你不知道:

data = {
"BANK": {
"no_data": "INT",
},
"SHOCK": {
"drop": "NOTI",
"rise": "NOTI",
"high_risk": "ALERT",
},
"online": None, 
"offline_few": "ALERT"
}

在这种情况下,您需要使用递归:

def unnest(dic, final=dict()):
for key, val in dic.items():
if not isinstance(val, dict):
final[key] = val
else:
dic2 = dict()
for k, v in val.items():
dic2[k] = v
unnest(dic2, final)
return final    
dic = unnest(data, {}) #every use of the function should have {} to solve issue pointed by @Ch3steR

在任何情况下,一旦你有了"未嵌套"的字典,打印出密钥都是微不足道的:

print(dic.keys())

递归函数

获取嵌套字典所有级别的所有键

def get_keys(d, result = None): 
# use default of None to fix issue noted by @Ch3steR
# namely: http://effbot.org/zone/default-values.htm
if result is None:
result = []
for k, v in d.items():
if isinstance(v, dict):
result.append(k)
get_keys(v, result)
else:
result.append(k)
return result

测试

print(get_keys(data)) 

输出

['BANK', 'no_data', 'SHOCK', 'drop', 'rise', 'high_risk', 'OFFLINE', 'online', 'offline_few']

您可以使用NestedDict。首次安装指示

pip install ndicts

然后

from ndicts.ndicts import NestedDict
data = {
"BANK": {
"no_data": "INT",
},
"SHOCK": {
"drop": "NOTI",
"rise": "NOTI",
"high_risk": "ALERT",
},
"OFFLINE": {"online": None, "offline_few": "ALERT"},
}
nd = NestedDict(data)

结果

>>> list(nd.keys())
[('BANK', 'no_data'), ('SHOCK', 'drop'), ('SHOCK', 'rise'), ('SHOCK', 'high_risk'), ('OFFLINE', 'online'), ('OFFLINE', 'offline_few')]

最新更新