Python - Initializing Multiple Lists/Line
这太难看了:
1 2 3 4 5 6 7 | psData = [] nsData = [] msData = [] ckData = [] mAData = [] RData = [] pData = [] |
有没有一种方法可以在一行中声明这些变量?
1 | alist, blist, clist, dlist, elist = ([] for i in range(5)) |
上述方法的缺点是,您需要计算
最重要的是,不要使用
1 | alist, blist, clist, dlist, elist = [[]] * 5 |
也不
1 | alist = blist = clist = dlist = elist = [] |
这将使所有名称引用相同的空列表!
1 | psData,nsData,msData,ckData,mAData,RData,pData = [],[],[],[],[],[],[] |
根据您的需要,您可以考虑在列表工厂中使用defaultdict。类似:
1 | my_lists = collections.defaultdict(list) |
然后您可以直接附加到我的_列表["psdata"]等等。这是相关的文档页面:http://docs.python.org/library/collections.html collections.defaultdict
更有效的方法:
1 | alist, blist, clist, dlist, elist = ([] for _ in xrange(5)) |
[注记]:
在python2中,
xrange() 比range() 更优化器。(参考)i 变量不可用,因此使用_ 更好。(参考)python3中未定义
xrange() 。
请牢记,整洁可能伴随着表演的后果。range函数调用会稍微减慢init进程。如果您有一些过程需要多次对变量进行约束,请注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import time def r_init(): st=time.time() alist, blist, clist, dlist, elist = ([] for i in range(5)) et=time.time() print("{:.15f}".format(et-st)) def p_init(): st=time.time() alist=[];blist=[];clist=[];dlist=[];elist=[] et=time.time() print("{:.15f}".format(et-st)) for x in range(1,10): r_init() p_init() print(" ") |
有点像
1 | alist, blist, clist, dlist, elist = ([],)*5 |
似乎是最优雅的解决方案。
您可以使用一个类来初始化/存储数据,它需要更多的行,但是更容易阅读,并且更面向对象。
像:
1 2 3 4 5 6 7 | class Data: def __init__(self): self.var1=[] <etc.> def zeroize(self): self.var1=[] <etc.> |
然后在开始的时候:
1 | data=Data() |
然后,在循环中或主post声明中的任何地方,都可以使用类。
1 2 3 | data.var1.append(varN) if(something): data.zeroize() |