关于Python:Python – 初始化多个列表/行

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))

上述方法的缺点是,您需要计算=左侧的名称数量,并且在右侧具有完全相同数量的空列表(例如,通过range调用,或者更明确地说)。一边。

最重要的是,不要使用

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()