如果我有嵌套字典,我可以通过索引来获得密钥:
{% 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'
编辑:我知道我的语法不正确。它是正确语法的代理。
答案 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)