1 回答
TA贡献1757条经验 获得超7个赞
生成器对这个问题很有用。策略——
Keys:跟踪当前的递归路径。一旦你碰到一片叶子,就让出当前的路径。
值:只产生叶子。
代码:
def getitems(obj):
def getkeys(obj, stack):
for k, v in obj.items():
k2 = ([k] if k else []) + stack # don't return empty keys
if v and isinstance(v, dict):
for c in getkeys(v, k2):
yield c
else: # leaf
yield k2
def getvalues(obj):
for v in obj.values():
if not v: continue
if isinstance(v, dict):
for c in getvalues(v):
yield c
else: # leaf
yield v if isinstance(v, list) else [v]
return list(getkeys(obj,[])), list(getvalues(obj))
输入:
{
"shortshirt": {
"ralphlauren": {
"classic": [
"That Ralph Lauren classic fit is a timeless look!",
"Nice choice. Can't go wrong with Ralph Lauren"
]
}
},
"socks": {
"": {
"": ["Have to find the right socks to keep your feet cozy"]
}
}
}
输出:
# keys
[['classic', 'ralphlauren', 'shortshirt'], ['socks']]
# values
[['That Ralph Lauren classic fit is a timeless look!', "Nice choice. Can't go wrong with Ralph Lauren"], ['Have to find the right socks to keep your feet cozy']]
添加回答
举报
