在不使用全局变量的情况下对 python 列表执行操作

Perform operation on python list without using global variables

我有一个 python 列表(例如 lst = [2, 3, 5])。对应于 lst 的每个元素,我想通过以下方式构造一个 numpy 矩阵:它应该是一个与 lst 的考虑元素相同大小的方阵,并且应该填充该元素的平方值。

目前我是这样处理这个问题的:

import numpy as np
lst = [2,3,5]
for i in range(len(lst)):
    globals()['mat'+str(lst[i])] = np.full( (lst[i],lst[i]), lst[i]**2 )

print globals()['mat'+str(2)]
print " "
print globals()['mat'+str(3)]
print " "
print globals()['mat'+str(5)]    

[[4 4]
 [4 4]]

[[9 9 9]
 [9 9 9]
 [9 9 9]]

[[25 25 25 25 25]
 [25 25 25 25 25]
 [25 25 25 25 25]
 [25 25 25 25 25]
 [25 25 25 25 25]]

在不使用全局变量的情况下执行此任务的有效方法是什么?

这里不存在效率问题,无论您如何命名或生成数组。不管命名如何,每个数组都必须使用 np.full。创建数组后,您可以将其收集到列表、字典中或将其分配给变量。

我会在列表中收集数组:

In [212]: lst = [2,3,5]
In [213]: lst1 = [np.full((i,i),i**2) for i in lst]
In [214]: lst1
Out[214]: 
[array([[4, 4],
        [4, 4]]), array([[9, 9, 9],
        [9, 9, 9],
        [9, 9, 9]]), array([[25, 25, 25, 25, 25],
        [25, 25, 25, 25, 25],
        [25, 25, 25, 25, 25],
        [25, 25, 25, 25, 25],
        [25, 25, 25, 25, 25]])]

如果您必须指定名称,请使用类似的名称:

In [215]: mat2, mat3, mat5 = lst1
In [216]: mat3
Out[216]: 
array([[9, 9, 9],
       [9, 9, 9],
       [9, 9, 9]])

globals()[] 技巧有效,但不是好的 Python 编程实践。它看起来更像是 BASIC 世界的延续,而不是惯用的 Python。在列表和字典中收集东西,而不是动态生成的全局变量。

说到字典,我们可以将列表转换为:

In [217]: adict = {f'mat{i}': x for i,x in zip(lst, lst1)}
In [218]: adict
Out[218]: 
{'mat2': array([[4, 4],
        [4, 4]]), 'mat3': array([[9, 9, 9],
        [9, 9, 9],
        [9, 9, 9]]), 'mat5': array([[25, 25, 25, 25, 25],
        [25, 25, 25, 25, 25],
        [25, 25, 25, 25, 25],
        [25, 25, 25, 25, 25],
        [25, 25, 25, 25, 25]])}

(这里我使用了新的 f-literal 字符串语法。)