pythonic方法从复杂的字典中收集特定数据

时间:2010-11-04 09:42:08

标签: coding-style python

我需要根据Dot Notation键名

从complext dict中收集一些数据

例如

示例数据

data = {
  'name': {'last': 'smith', 'first': 'bob'},
  'address':{'city': 'NY', 'state': 'NY'},
  'contact':{'phone':{'self':'1234', 'home':'222'}},
  'age':38,
  'other':'etc'
}

keys = ['contact.phone.self', 'name.last', 'age']

我的逻辑

result = []
for rev_key in rev_keys:  
  current = data.copy()   
  rev_key = rev_key.split('.')  
  while rev_key:  
    value = rev_key.pop(0)  
    current = current[value]  
  result.append(current)

提前致谢!

4 个答案:

答案 0 :(得分:4)

[reduce(dict.get, key.split("."), data) for key in keys]

答案 1 :(得分:0)

这个怎么样?

def fetch( some_dict, key_iter ):
    for key in key_iter:
        subdict= some_dict
        for field in key.split('.'):
            subdict = subdict[field]
        yield subdict

a_dict = {
  'name': {'last': 'smith', 'first': 'bob'},
  'address':{'city': 'NY', 'state': 'NY'},
  'contact':{'phone':{'self':'1234', 'home':'222'}},
  'age':38,
  'other':'etc'
}

keys = ['contact.phone.self', 'name.last', 'age']

result = list( fetch( a_dict, keys ) )

答案 2 :(得分:0)

这是我对它的抨击:

>>> def find(tree,cur):
    if len(cur)==1:
        return tree[cur[0]]
    else:
        return find(tree[cur[0]],cur[1:])


>>> print [find(data,k.split(".")) for k in keys]
['1234', 'smith', 38]

当然,如果项目嵌套太深,这将导致堆栈溢出(除非您明确提高递归深度),如果这是生产代码,我会使用deque而不是list

答案 3 :(得分:0)

只需编写一次获取一个键的函数

def getdottedkey(data, dottedkey):
    for key in dottedkey.split('.'):
        data = data[key]
    return data

print [getdottedkey(data, k) for k in keys]