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

时间:2019-01-05 06:46:46

标签: python python-2.7 list numpy numpy-ndarray

我有一个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]]

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

1 个答案:

答案 0 :(得分:2)

无论您如何命名或生成阵列,这里都没有效率问题。无论命名如何,每个数组都必须使用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字符串语法。)