我正在尝试构建一个为python3中的defaultdict分配键和值的函数,但是它在exec执行中失败。假设我需要在内部的defaultdict中传递几个str变量作为键,而其他作为值传递:
定义dd:
Select a.*, b.schedule
from Tablea a
left join Tableb b
ON a.subid = b.subid
AND b.date > NOW()
AND.active = 1
将变量确定为键:
dict=dd(lambda: dd(lambda: dd(lambda: dd(list))))
将变量确定为值:
keys_var = ['a', 'b', 'c', 'd']
安排键的值:
values_var = ['d', 'e', 'f', 'g' ]
它看起来像:
key_for_dict = []
for value in keys_var :
value_for_keys.append( '[' + str(value) + ']' )
string_insert_keys = ''.join(key_for_dict)
为插入值安排值:
[a][b][c][d]
它看起来像:
values_for_dict = []
for value in values_var:
values_for_dict.append(value)
string_for_values = ', '.join(values_for_dict)
string_insert_values = "[ " + string_for_values + " ]"
现在定义一个函数,将这些键和值插入循环中(其中a,b,c,d等采用不同的值,最后一个参数是所有d,e,f,g的连接)>
我尝试过:
[ d, e, f, g ]
但是失败了:
def riempie_dict_var( dizionario ) :
exec( dizionario + string_insert_keys + ".append('___'.join( " + string_insert_columns + "))" )
答案 0 :(得分:0)
如果您必须使用exec()
,则应该能够:
from collections import defaultdict as dd
prova_dizionario = dd(lambda: (dd(list)))
ciao, bao = 'ciao', 'bao'
exec("prova_dizionario[ciao][bao] = ['', '', '' ]")
但是,如果您提供更多的背景信息,那么这里的人们很可能会帮助您提出一个 exec-free 解决方案。
编辑
我不确定我是否完全理解您的问题,但是在我看来,您有一个递归数据结构,最好使用递归代码进行处理:
from collections import defaultdict as dd
def recursive_insert(dictionary, keys_var, values_var):
head, *tail = keys_var
if tail:
recursive_insert(dictionary[head], tail, values_var)
else:
dictionary[head].extend(values_var)
dictionary = dd(lambda: dd(lambda: dd(lambda: dd(list))))
keys_var = ['a', 'b', 'c', 'd']
values_var = ['d', 'e', 'f', 'g']
recursive_insert(dictionary, keys_var, values_var)
print(dictionary['a']['b']['c']['d'])
输出
% python3 test.py
['d', 'e', 'f', 'g']
%