назначение exec и defaultdict в python3 - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь создать функцию, которая присваивает ключи и значения defaultdict в python3, но при выполнении exec происходит сбой.Допустим, мне нужно передать несколько переменных str в качестве ключей и другие значения в defaultdict внутри:

Определить dd:

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]

Упорядочить значения для значенийinsert:

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'

1 Ответ

0 голосов
/ 29 января 2019

Если вы должны использовать 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']
%
...