如何将 dict.get() 与多维字典一起使用?

新手上路,请多包涵

我有一个多维字典,我希望能够通过键:键对检索值,如果第一个键不存在则返回“NA”。所有的子字典都有相同的键。

 d = {   'a': {'j':1,'k':2},
        'b': {'j':2,'k':3},
        'd': {'j':1,'k':3}
    }

我知道我可以使用 d.get('c','NA') 获取子字典(如果它存在),否则返回“NA”,但我真的只需要子字典中的一个值。我想做一些类似 d.get('c['j']','NA') 如果存在的话。

现在我只是检查顶级键是否存在,然后将子值分配给变量(如果存在)或 'NA' 如果不存在。但是,我这样做了大约 50 万次,还从其他地方检索/生成有关每个顶级密钥的其他信息,我正在尝试加快速度。

原文由 user2034412 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 591
2 个回答

怎么样

d.get('a', {'j': 'NA'})['j']

如果不是所有子项都有 j 键,那么

d.get('a', {}).get('j', 'NA')

要减少创建的相同对象,您可以设计类似

class DefaultNASubdict(dict):
    class NADict(object):
        def __getitem__(self, k):
            return 'NA'

    NA = NADict()

    def __missing__(self, k):
        return self.NA

nadict = DefaultNASubdict({
                'a': {'j':1,'k':2},
                'b': {'j':2,'k':3},
                'd': {'j':1,'k':3}
            })

print nadict['a']['j']  # 1
print nadict['b']['j']  # 2
print nadict['c']['j']  # NA

使用 defaultdict 想法相同:

 import collections

class NADict(object):
    def __getitem__(self, k):
        return 'NA'

    @staticmethod
    def instance():
        return NADict._instance

NADict._instance = NADict()

nadict = collections.defaultdict(NADict.instance, {
                'a': {'j':1,'k':2},
                'b': {'j':2,'k':3},
                'd': {'j':1,'k':3}
            })

原文由 Pavel Anossov 发布,翻译遵循 CC BY-SA 3.0 许可协议

另一种获取多维字典示例的方法(使用两次 get 方法)

 d.get('a', {}).get('j')

原文由 Hafiz Muhammad Shafiq 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏