gpt4 book ai didi

python - 迭代字典Python时无限循环

转载 作者:行者123 更新时间:2023-12-01 04:38:11 26 4
gpt4 key购买 nike

假设我有两个这样的字典,

data_dict = {'A1': 5, 'A2': 10, 'A3': 15}

formula_dict = {'A4': 'A1*A3', 'A6': 'A1+A5+A2', 'A5': 'A1+A2+A3+A4'}

我正在迭代公式字典并评估表达式,然后再次追加回 data_dict 的副本,直到完全评估所有公式。逻辑工作正常,但会导致无限循环。如何解决这个无限循环?

def update_some(convert_dict, in_dict):
in_dict_update = in_dict.copy()
convert_dict_update = convert_dict.copy()
while convert_dict_update:
for k, v in list(convert_dict_update.items()):
print(convert_dict_update.items())
try:
return_value = eval(v, in_dict)
in_dict_update[k] = return_value
convert_dict_update.pop(k)
except NameError:
continue

update_some(convert_dict_update, in_dict_update)
print(in_dict_update)
print('After ', convert_dict_update)
print(in_dict_update)
return in_dict_update


# update_some(converted_dict, data_dict)

同时打印in_dict_update会打印一些垃圾键、值对,例如一些__builtins__

最佳答案

您对 eval 的调用使用 in_dict 作为缺少标准全局属性的全局字典。所以 python 会为你添加它们。尝试:

return_value = eval(v, None, in_dict)

但是,您应该尝试降低递归的复杂性。我建议:

def update_some(convert_dict, in_dict):
in_dict_update = in_dict.copy()
skipped_values = {}
for k,v in convert_dict.items():
try:
return_value = eval(v, None, in_dict_update)
except NameError:
skipped_values[k] = v
else:
in_dict_update[k] = return_value
if skipped_values:
in_dict_update = update_some(skipped_values, in_dict_update)
return in_dict_update

关于python - 迭代字典Python时无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31339760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com