python - 更改 python 代码以摆脱 exec() 和 eval()
问题描述
我是 python 新手,正在尝试通过删除 exec() 和 eval() 的经常使用来提高代码的可读性和速度。但是,对我来说,我需要如何更改代码来获得它并不明显。
我希望程序根据输入创建名称的数据框和数组。假设输入是这样的:
A=[Red, Blue]
B=[Banana, Apple]
C=[Pie, Cake]
然后代码将根据输入的每个组合创建一个具有名称的数据框:Red_Banana_Pie、Red_Banana_Cake、Red_Apple_Pie、Red_Apple_Cake 等,通过循环遍历三个列表。
for color in A[0:len(A)]:
for fruit in B[0:len(B)]:
for type in C[0:len(C)]:
然后在每个循环中:
exec('DataFr_'+color+'_'+fruit+'_'+type+'=pd.DataFrame((Data),columns=[\'Title1\',\'Title2\'])')
如果没有 exec 命令,我怎么能做到这一点?
解决方案
运行时exec('DataFr_'+color+'_'+fruit+'_'+type+'=pd.DataFrame((Data),columns=[\'Title1\',\'Title2\'])')
,您将获得 8 个具有不同名称的 DataFrame。但我不建议这样做,因为您必须在eval()
每次要访问 DataFrame 时使用。(否则您可以对其进行硬编码,但这真的很糟糕)
我认为您需要数据框的多维字典。
当输入为
A=["Red", "Blue"]
B=["Banana", "Apple"]
C=["Pie", "Cake"]
[+] 另外,您基本上会像string
在 python 中一样获得用户输入。(如"hello, world!"
)
data_set = {}
for color in A:
data_set.update({color:{}})
for fruit in B:
data_set[color].update({fruit:{}})
for type in C:
data_set[color][fruit].update({type:pd.DataFrame((Data),columns=['Title1','Title2'])})
# I think you have some Data in other place, right?
[0:len(A)]
[+] 此外,您可以在没有 Python 的情况下迭代 List 。
然后您可以使用每个 DataFrame data_set['Red']['Banana']['Cake']
。(您的实现将是data_set[A[0]][B[0]][C[1]]
)然后您可以为每种颜色、水果、没有 eval 的类型动态创建 DataFrame,并在没有硬编码值的情况下访问它们。
推荐阅读
- r - 尝试使用交叉验证从不同大小的模型中识别出最好的回归模型
- python - 使用否定集 [^] 和什么?否定同一行中的子字符串
- android - 在 Activity 上调用 onSaveInstanceState
- c++ - 将函数声明为友元时尖括号是什么意思?
- sparkr - 在 RStudio 中启动 SparkR 时如何解决 (javaVersionNum != sparkJavaVersion)
- javascript - 我可以从 html 文件(angularjs)调用 .js 文件吗
- perl - 怎么能 #?在不首先使用 @? 的情况下在取消引用的数组上使用?
- mysql - mysql忽略检查约束
- python - 如何在 RNN 模型中使用图像集
- dialogflow-es - 在 Dialogflow 中使用自定义事件通过检测意图 API 调用事件