如何安全地检查python字典是否有递归存储的多个密钥字典对

时间:2017-02-27 03:48:19

标签: python dictionary try-catch

如果我有一个dict,d我想在d['e']['foo']['bar']检查一个值,其中e和foo是字典,而bar给出一个字符串,什么是SAFELY获取该位置值的方法?除了尝试捕获之外还有什么吗?

4 个答案:

答案 0 :(得分:3)

一种好方法是使用class Node: def __init__(self): self.data = None self.next = None def getData(self): return self.data def getNext(self): return self.next def setData(self,newdata): self.data = newdata def setNext(self,newnext): self.next = newnext class Stack : def _init_(self): self.head=None def push(self,data): temp=Node() temp.setData(data) temp.setNext(self.head) self.head=temp def pop(self): temp=Node() temp=self.getData() self.head=self.head.getNext() return temp

reduce

您可以制作d={'e':{'foo':{'bar':"final value"}}} l=['e','foo','bar'] print reduce(lambda x,y:x.get(y),l, d) 并将function传递给它。

输出:list

答案 1 :(得分:1)

get与默认的空字典一起使用:

>>> d = {'e':{'foo':{'bar':0}}}
>>> print(d.get('e', {}).get('foo', {}).get('bar'))
0
>>> print(d.get('f', {}).get('doo', {}).get('car'))
None
>>> print(d.get('e', {}).get('foo', {}).get('car'))
None
>>> print(d.get('e', {}).get('doo', {}).get('bar'))
None

答案 2 :(得分:1)

一种方法是沿着这些方向使用简单的辅助函数:

def dive(d, *ks):
    for k in ks:
        if isinstance(d, dict) and k in d:
            d = d[k]
        else:
            return None
    return d

examples = [
    {},
    {'e': {'foo': 12}},
    {'e': {'foo': {'bar': 999}}},
]

for i, e in enumerate(examples):
    print(i, dive(e, 'e', 'foo', 'bar'))

输出:

(0, None)
(1, None)
(2, 999)

答案 3 :(得分:0)

确保键在此词典中,您可以试试这个:

if "e" in d:
    print d["e"]

或尝试使用get方法,如果密钥不可用,则返回默认值。

  

如果key在字典中,则返回key的值,否则返回default。如果   默认情况下没有给出,默认为None,所以这个方法永远不会   提出了一个KeyError。

d.get("e","default value")
相关问题