Python 中用列表中的字元串元素作為名字來創建新變數
問題的提出
今天我在寫一個與計算化學相關的某個 Python 腳本的時候,突然有了一個這樣的疑問:
如果給定一個列表(list) a; 已知該列表中的元素均為字元串(str); 列表中元素的個數 n 以及作為列表元素的這些字元串的值都是不預知的; 那麼,如何以這些列表元素作為變數名稱來批量創建 n 個新變數呢? 以創建 n 個新列表為例。
於是我開始在 V2mm 的群以及其他小夥伴的群裡面求助,得到了以 River 和 Xuanwo 等技術流的指點。總結如下:
用類實現
這兩種方法是 River 提供的。
方法1 靜態類型
a = [r,e,m]nnclass Test():n def __init__(self,a = [r,e,m]):n for item in a:n setattr(self, item, [])nnTest(a)n
方法2 動態類型
a = [r,e,m]nnMyClass = type(MyClass, (), {i: [] for i in a})nnprint(MyClass().r, MyClass().e,MyClass().m) # [] [] []n
用字典
這種方法是 FlagPlus 提供的思路;
a = [r,e,m]ntmp={}nfor item in a:n tmp.update({item:[]})n
River 給出了精簡的建議:
a = [r,e,m]nm=({k: [] for k in a})n
用類加字典
這種方法是我基於 FlagPlus 提供的思路自己亂寫的。
a = [r,e,m]nnclass Test2():n tmp={}n def __init__(self,a = [r,e,m]):n self.a=an for item in self.a:n self.tmp.update({item:[]})nnTest2(a)n
用 locals 來添加變數
這兩種方法是 River 提供的,用 globals 應該也可以。 River 不推薦這種方法,因為這樣可能污染 module 的命名空間。
a = [r,e,m]nfor x in test:n locals()[x] = []n
用函數來封裝一下:
a = [r,e,m]nndef func(mylist):n for x in mylist:n locals()[x] = []nnfunc(a)n
用 exec 直接將字元串來執行
這個思路來自 Kivy 群的 X_Tu,應該是最簡單直接地解決了問題。
a = [r,e,m]nfor i in a :n exec(i+=[])n
Xuanwo 不推薦這樣做,變數創建會造成性能開銷,因為存在棧上而不是堆上。范神 推薦對複雜數據使用資料庫,資料庫操作時間是毫秒級,會更快一些。說的資料庫是毫秒級,毫秒級是慢的,CPU都是低於微秒的,所以他不推薦用資料庫。。。。
推薦閱讀:
TAG:Python |