繁体   English   中英

Python - 初始化多个列表/行

[英]Python - Initializing Multiple Lists/Line

这是非常丑陋的:

psData = []
nsData = []
msData = []
ckData = []
mAData = []
RData = []
pData = []

有没有办法在一行中声明这些变量?

alist, blist, clist, dlist, elist = ([] for i in range(5))

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

最重要的是,不要使用类似的东西

alist, blist, clist, dlist, elist = [[]] * 5

也不

alist = blist = clist = dlist = elist = []

这将使所有名称都指向同一个空列表!

psData,nsData,msData,ckData,mAData,RData,pData = [],[],[],[],[],[],[]

根据您的需要,您可以考虑将 defaultdict 与列表工厂一起使用。 就像是:

my_lists = collections.defaultdict(list)

然后你可以直接附加到 my_lists["psData"] 等等。 这是相关的文档页面: http : //docs.python.org/library/collections.html#collections.defaultdict

更有效的方法:

alist, blist, clist, dlist, elist = ([] for _ in xrange(5))

[注意]:

  • xrange()Python2 中range()更优化。 ( 参考)

  • i变量不可用,因此使用_更好。 (参考)

  • xrange()未在Python3 中定义。

请记住,整洁可能会带来性能的后果。 range 函数调用会稍微减慢 init 进程。 如果您有一些需要多次重新初始化变量的进程,请注意。

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("\n")

您可以使用一个类来初始化/存储数据,它需要更多的行,但可能更容易阅读,并且更面向对象。

喜欢:

class Data:
    def __init__(self):
        self.var1=[]
        <etc.>
    def zeroize(self):
        self.var1=[]
        <etc.>

然后在主要开始附近:

data=Data()

然后在您的循环或主帖子声明中的任何地方,您都可以使用该类。

data.var1.append(varN)
if(something):
    data.zeroize()

类似的东西

alist, blist, clist, dlist, elist = ([],)*5

似乎是最优雅的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM