在不使用全局变量的情况下对 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
字符串语法。)
我有一个 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
字符串语法。)