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

2024-04-19 09:36:51 发布

您现在位置:Python中文网/ 问答频道 /正文

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

不使用全局变量执行此任务的有效方法是什么?你知道吗


Tags: importnumpy元素列表asnp方式矩阵
1条回答
网友
1楼 · 发布于 2024-04-19 09:36:51

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

相关问题 更多 >