我有 dict 的 dict 的 dict 。我想要一个函数,如果参数与键匹配,它将返回所有详细信息,例如,
identifiers = {
'42566431313931326462642d3533656132352033': {
'name': 'topleft',
'subid': {
'a3e54b84450000': {
'name': 'north'
}
}
},
'0942378098093': {
'name': 'topright',
'subid': {
'4b840000100000000000': {
'name': 'north'
}
}
},
'4256643131ra98892389': {
'name': 'bottomleft',
'subid': {
'a3e54b840000100000000000': {
'name': 'west'
}
}
}
}
def getdetails(p):
# p could be key of dict or dict of dict
for key in identifiers:
if key == p:
return identifiers[key]
else:
if p in identifiers[key]['subid']:
return identifiers[key]['subid'][p]
我想知道是否有优雅的方法(可能使用 map 和 lambda)?
最佳答案
可读性很重要。由于您的代码是可读的,我会稍微改进代码,像这样
def getdetails(p):
if p in ids:
return ids[p]
for k, v in ids.iteritems():
if p in v['subid']:
return v['subid'][p]
但是如果您正在寻找单行代码,您可以创建一个生成器表达式并返回从中获得的第一个值。
def getdetails(p):
if p in ids: return ids[p]
return next(v['subid'][p] for k, v in ids.iteritems() if p in v['subid'])
你可以进一步缩短代码,像这样
def getdetails(p):
return ids.get(p) or next(v['subid'][p] for k, v in ids.iteritems() if p in v['subid'])
dict.get
将返回 None
如果在字典中找不到键并且在 Python 中被认为是 Falsy。因此,如果它不在主词典中,我们将在子词典中进行检查。
如果你使用的是 Python 3.x,你需要使用 items
方法而不是 iteritems
,像这样
def getdetails(p):
return ids.get(p) or next(v['subid'][p] for k, v in ids.items() if p in v['subid'])
关于python - 在python中迭代dict of dict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23604909/