【问题标题】:Print name of array in for loop在for循环中打印数组名称
【发布时间】:2020-09-08 19:49:12
【问题描述】:

我有这些数据集和这个循环:

df1 = np.array([[91,9], [22,78]])
df2 = np.array([[99,1], [21,79]])
df3 = np.array([[96,4], [10,90]])
df4 = np.array([[98,2], [18,82]])

dfs = [df1, df2, df3, df4]
for i in dfs:
    tpr = i[1,1] / (i[1,0] + i[1,1])
    print('tpr: ', tpr)

输出是:

tpr:  0.78
tpr:  0.79
tpr:  0.9
tpr:  0.82

我怎样才能得到这样的输出?

df1 -- tpr:  0.78
df2 -- tpr:  0.79
df3 -- tpr:  0.9
df4 -- tpr:  0.82

主要问题是我需要打印数组的名称。我查看了其他一些答案(不同的问题)并尝试了这些,但无法使其正常工作。 比如[i]等print语句中的东西来尝试获取名字。

例如How to print the list in 'for' loop using .format() in Python?,但问题不同,似乎不适用。

【问题讨论】:

标签: python numpy loops for-loop


【解决方案1】:

最好的办法可能是使用字典来存储你的数组。

dfs = {'df1': df1, 'df2': df2, 'df3': df3, 'df4': df4}

然后您可以遍历键以获取它们的名称,然后为它们的值索引字典。

for i in dfs.keys():
    val = dfs[i]
    tpr = val[1,1] / (val[1,0] + val[1,1])
    print(i, '-- tpr: ', tpr)

或者,您可以安装 varname 并使用 varname.nameof() 获取名称。

【讨论】:

  • 太棒了。感谢您的回答。
【解决方案2】:

您可以从全局变量中检索变量名

import numpy as np

df1 = np.array([[91,9], [22,78]])
df2 = np.array([[99,1], [21,79]])
df3 = np.array([[96,4], [10,90]])
df4 = np.array([[98,2], [18,82]])

dfs = [df1, df2, df3, df4]
for i, df in enumerate(dfs):
    tpr = df[1,1] / (df[1,0] + df[1,1])
    # Use generator to find name of current df in global names table
    name = next(x for x in globals() if globals()[x] is df)
    print(f'{name} -- tpr: {tpr}')

输出

df1 -- tpr: 0.78
df2 -- tpr: 0.79
df3 -- tpr: 0.9
df4 -- tpr: 0.82

【讨论】:

    【解决方案3】:

    请注意,您用于变量的名称不应该包含在您的代码逻辑中 - 这只是一个糟糕的主意。

    但是 - 要知道您的输出来自哪个数据帧 - 您可以在循环中打印该数据帧的索引:

    import numpy as np
    
    df1 = np.array([[91,9], [22,78]])
    df2 = np.array([[99,1], [21,79]])
    df3 = np.array([[96,4], [10,90]])
    df4 = np.array([[98,2], [18,82]])
    
    dfs = [df1, df2, df3, df4]
    for i, df in enumerate(dfs):
        tpr = df[1,1] / (df[1,0] + df[1,1])
        print(f'df{i+1} -- tpr: {tpr}')
    

    输出:

    df1 -- tpr: 0.78
    df2 -- tpr: 0.79
    df3 -- tpr: 0.9
    df4 -- tpr: 0.82
    

    我使用i+1 来获得您想要的相同输出,但仅使用i 会更准确。

    【讨论】:

    • 为什么不命名并以有用的方式打印它们呢? “df1”有点普通,但如果 OP 想要命名事物并以类似方式打印事物,对我来说似乎是合理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2015-11-01
    • 1970-01-01
    • 2018-07-05
    • 2020-05-01
    • 1970-01-01
    相关资源
    最近更新 更多