首页 > 解决方案 > 更改 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 命令,我怎么能做到这一点?

标签: pythondataframeexeceval

解决方案


运行时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,并在没有硬编码值的情况下访问它们。


推荐阅读