2017-02-27 79 views
0

如果我有一个字典,d和我想检查一个值d['e']['foo']['bar']其中e和foo是字典,并且bar给出一个字符串什么是一种方法安全地获得该位置的价值?除了尝试抓住之外还有什么?如何安全地检查一个Python字典是否有递归存储的多个密钥字典对

+0

你可以尝试使用'collections.defaultdict()单曲。见http://stackoverflow.com/questions/5029934/python-defaultdict-of-defaultdict – synchronizer

+0

@synchronizer,然后只检查值是一个“真正的”一个或没有。谢谢! – Bren

+0

可以肯定的是,我正在编写一个快速程序来验证我所说的内容。 – synchronizer

回答

3

一个好方法是使用reduce

d={'e':{'foo':{'bar':"final value"}}} 
l=['e','foo','bar'] 
print reduce(lambda x,y:x.get(y),l, d) 

,您可以拨打function并传递list给它。

输出:final value

+0

@但如果它的键-val对丢失,你会得到一个异常。我想补充一下。get(y,默认)将会消除这种情况。虽然然后我会得到一个类型的例外None.get – Bren

+0

@Bren,但在任何情况下,你将不得不处理这种情况.....但在这种方法中,您可以使用列表中的变量值...其通用功能....我给你留下错误处理....'.get'有一个默认值'None'.You'' exception – vks

+0

@Bren这将工作所有长链和小的 – vks

0

确保钥匙在此快译通,你可以试试这个:

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

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

如果键在字典中,则返回键的值,否则为默认值。如果 默认没有给出,则默认为无,所以,这种方法从未 抛出一个KeyError。

d.get("e","default value") 
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 
+0

我正在尝试避免长链。但是这在技术上会起作用。 – Bren

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) 
相关问题