python - 在python中迭代dict of dict

标签 python

我有 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/

相关文章:

python - peewee 模型会自动关闭连接吗?

python - Pandas groupby - 按列值扩展平均值

python - 如何在 Python 的 Celery 应用程序中测试重试?

python - 如何以 pythonic 方式操作/清理 Linux 垃圾文件夹?

python - 查找包含 'inf' 或 'nan' 的项目的索引

python - 在 Python 中解析日期并检索特异性

python - 如何根据条件在 qweb 报告上隐藏或显示 python 函数的内容?

python - 如何使用 webbrowser 模块在 python 3 中打开网站但在后台?

python - 使用 python 的 BigQuery 外部表

python - 在 Tensorflow 中广播动态维度