将嵌套字典位置作为Python中的参数传递

时间:2016-11-07 15:35:38

标签: python parameter-passing

如果我有嵌套字典,我可以通过索引来获得密钥:

{% block my_field_upload_widget %}
  {% spaceless %}

  {# the file input field #}
  {{ block('file_widget') }}

  {% if file_path|default and not required %}
      {# the additional checkbox #}
      {{ form_row(attribute(form, id ~ 'DeleteFile')) }}
  {% endif %}

  {% endspaceless %}
{% endblock %}

我能将该索引作为函数参数传递吗?

>>> d = {'a':{'b':'c'}}
>>> d['a']['b']
'c'

编辑:我知道我的语法不正确。它是正确语法的代理。

4 个答案:

答案 0 :(得分:4)

您可以使用reduce(或python 3中的functools.reduce),但这也需要您传入密钥的列表/元组:

>>> def get_nested_value(d, path=('a', 'b')):
        return reduce(dict.get, path, d)

>>> d = {'a': {'b': 'c'}}
>>> get_nested_value(d)
'c'
>>> 

(在您的情况下['a']['b']不起作用,因为['a']是一个列表,['a']['b']正在尝试查找“ b ”中的元素该列表的索引)

答案 1 :(得分:2)

我遇到了同样的问题,并且正在使用递归函数来解决它:

def access_path (lambda json, path): 
    if len(path) == 0:
        return json
    else 
        return access_path(json[path[0]], path[1:]))

这既适用于嵌套的dict-of-dicts,也适用于字典列表:

test = {
    'a' : {
        'b' : 420
    },
    'c' : [
        {
            'id' : 'd1'
        },
        {
            'id' : 'd2'
        },
        {
            'id' : 'd3'
        },
    ]
}

print(access_path(test, ['a', 'b']))
print(access_path(test, ['c', 1, 'id']))

返回

420
d2

答案 2 :(得分:1)

不是真的,但通过重写函数体,您可以将键作为元组或其他序列传递:

def get_nested_value(d, keys):
    for k in keys:
        d = d[k]
    return d

d = {'a':{'b':'c'}}
print get_nested_value(d, ("a", "b"))

答案 3 :(得分:0)

看看https://github.com/akesterson/dpath-python

它使遍历嵌套字典变得容易得多。

有将遍历了所有的在字典中的条件,所以没有特殊的循环结构需要。