Coding style 从复杂dict中收集特定数据的pythonic方法

Coding style 从复杂dict中收集特定数据的pythonic方法,coding-style,python,Coding Style,Python,我需要从complext dict中收集一些基于点符号键名的数据 比如说 样本数据 我的逻辑 提前谢谢 这个怎么样 [reduce(dict.get, key.split("."), data) for key in keys] def fetch( some_dict, key_iter ): for key in key_iter: subdict= some_dict for field in key.split('.'):

我需要从complext dict中收集一些基于点符号键名的数据

比如说

样本数据

我的逻辑

提前谢谢

这个怎么样

[reduce(dict.get, key.split("."), data) for key in keys]
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 ) )
这个怎么样

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 ) )
这是我的破绽:

>>> 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而不是列表

这是我的破绽:

>>> 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而不是列表

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

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

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

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

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

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

永远不要将类名用作变量名。请修复该示例以避免使用dict作为变量。这是一个可怕的错误。永远不要使用类名作为变量名。请修复该示例以避免使用dict作为变量。这是一个可怕的错误!我几乎不明白reduce是如何编写字典的,但我终于找到了它。令人钦佩的解决办法+1是不够的!我几乎不明白reduce是如何编写字典的,但我终于找到了它。令人钦佩的解决办法+1是不够的