python3 中的 exec 和 defaultdict 赋值
exec and defaultdict assignment in python3
我正在尝试构建一个将键和值分配给 python3 中的 defaultdict 的函数,但它在 exec 执行中失败了。假设我需要在 defaultdict 中将几个 str 变量作为键和其他作为值传递:
定义一个地址:
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 + " ]"
它看起来像:
[ d, e, f, g ]
现在定义一个函数以在循环中插入这些键和值(其中 a、b、c、d 等采用不同的值,最后一个参数是所有这些 d、e、f、g 的连接)
我试过了:
def riempie_dict_var( dizionario ) :
exec( dizionario + string_insert_keys + ".append('___'.join( " + string_insert_columns + "))" )
但它失败了:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'collections.defaultdict' and 'str'
如果您必须使用exec()
,您应该能够做到:
from collections import defaultdict as dd
prova_dizionario = dd(lambda: (dd(list)))
ciao, bao = 'ciao', 'bao'
exec("prova_dizionario[ciao][bao] = ['', '', '' ]")
但是,如果您提供更多上下文,这里的人可能会帮助您提出 无执行 解决方案。
编辑
我不确定我是否完全理解你的问题,但在我看来你有一个 递归 数据结构,最好用 递归代码:
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']
%
我正在尝试构建一个将键和值分配给 python3 中的 defaultdict 的函数,但它在 exec 执行中失败了。假设我需要在 defaultdict 中将几个 str 变量作为键和其他作为值传递:
定义一个地址:
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 + " ]"
它看起来像:
[ d, e, f, g ]
现在定义一个函数以在循环中插入这些键和值(其中 a、b、c、d 等采用不同的值,最后一个参数是所有这些 d、e、f、g 的连接)
我试过了:
def riempie_dict_var( dizionario ) :
exec( dizionario + string_insert_keys + ".append('___'.join( " + string_insert_columns + "))" )
但它失败了:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'collections.defaultdict' and 'str'
如果您必须使用exec()
,您应该能够做到:
from collections import defaultdict as dd
prova_dizionario = dd(lambda: (dd(list)))
ciao, bao = 'ciao', 'bao'
exec("prova_dizionario[ciao][bao] = ['', '', '' ]")
但是,如果您提供更多上下文,这里的人可能会帮助您提出 无执行 解决方案。
编辑
我不确定我是否完全理解你的问题,但在我看来你有一个 递归 数据结构,最好用 递归代码:
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']
%