【问题标题】:Altering python code to get rid of exec() and eval()更改 python 代码以摆脱 exec() 和 eval()
【发布时间】:2020-08-31 12:14:12
【问题描述】:

我是 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 命令,我怎么能做到这一点?

【问题讨论】:

  • for color in A:

标签: python dataframe exec eval


【解决方案1】:

当您运行exec('DataFr_'+color+'_'+fruit+'_'+type+'=pd.DataFrame((Data),columns=[\'Title1\',\'Title2\'])') 时,您将获得 8 个具有不同名称的 DataFrame。但我不建议这样做,因为每次要访问 DataFrame 时都必须使用 eval()。(否则您可以对其进行硬编码,但这真的很糟糕)

我认为您需要数据帧的多维字典。

输入时

A=["Red", "Blue"]
B=["Banana", "Apple"]
C=["Pie", "Cake"]

[+] 另外,您基本上会在 python 中以string 形式获得用户输入。(如"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?

[+] 此外,您可以在 python 中不使用[0:len(A)] 迭代 List。

然后您可以通过data_set['Red']['Banana']['Cake'] 使用每个DataFrame。(您的实现将是data_set[A[0]][B[0]][C[1]]) 然后,您可以为每种颜色、水果、无需 eval 的类型动态创建 DataFrame,并且无需硬编码值即可访问它们。

【讨论】:

  • 非常感谢!我会努力实现的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多