在字典理解中使用变量名作为键

Use variable name as key in dictionary comprehension

我正在尝试使用变量名称作为键并使用 numpy 数组的中位数作为值来填充字典。例如:

import numpy as np

# Make up some data
array1 = np.random.randint(255, size=(4, 4))
array2 = np.random.randint(255, size=(4, 4))
array3 = np.random.randint(255, size=(4, 4))
array4 = np.random.randint(255, size=(4, 4))

# Generate a dict with variable name key and median value 
d = {f"{x}":np.median(x) for x in [array1, array2, array3, array4]}

这产生:

{'[[ 27 234  43 110]\n [105 199 173  28]\n [ 97 235  32  62]\n [ 42 193 234  29]]': 101.0,
 '[[ 68 150  75 207]\n [156 188  47 116]\n [161  90  18 173]\n [213  12  65 216]]': 133.0,
 '[[188  26 229 204]\n [ 65 214 197 165]\n [  3  86 124 221]\n [ 87  27 189 125]]': 145.0,
 '[[193 158 107 148]\n [187  30  38 104]\n [ 44 137  31 227]\n [243 212  25 110]]': 123.5}

但是,我想将变量名添加到字典中,而不是将 numpy 数组作为字符串。这是我想要的输出:

{'array1': 101.0,
 'array2': 133.0,
 'array3': 145.0,
 'array4': 123.5}

如何将变量名称作为字符串添加到字典理解中?

我认为你最好的选择是,如果你想在未来更改名称,那么你最好的选择是对名称和数组进行字典:

names = {
    "array1": array1,
    "array2": array2,
    "array3": array3,
    "array4": array4
}

d = {x:np.median(names[x]) for x in names}

使用 array1array2 等变量从一开始就是错误的。让我们假设这些名字是有意义的名字。

然后我们可以从变量名开始,在各种变量字典中查找它们。比如像这样:

import numpy as np

# Make up some data
array1 = np.random.randint(255, size=(4, 4))
array2 = np.random.randint(255, size=(4, 4))
array3 = np.random.randint(255, size=(4, 4))
array4 = np.random.randint(255, size=(4, 4))

# Generate a dict with variable name key and median value
d = {x:np.median(locals().get(x,globals().get(x))) for x in ["array1", "array2", "array3", "array4"]}


>>> d
{'array1': 156.5, 'array2': 76.0, 'array3': 100.0, 'array4': 85.0}

locals().get(x,globals().get(x)) 是一种尝试首先在本地然后在全局中获取名为 x 的变量的方法。它会忽略非本地人(但可以做到,这只是一个更复杂的表达式)。

如果可能,我建议从一开始就将变量存储在字典中,这样得到结果就很简单了:

datadict = {}
datadict["array1"] = np.random.randint(255, size=(4, 4))
datadict["array2"] = np.random.randint(255, size=(4, 4))
datadict["array3"] = np.random.randint(255, size=(4, 4))
datadict["array4"] = np.random.randint(255, size=(4, 4))

# Generate a dict with variable name key and median value
d = {k:np.median(v) for k,v in datadict.items()}