簡體   English   中英

在不使用全局變量的情況下對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字符串語法。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM