Python-初始化多个列表/行


77

这非常丑陋:

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

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


1
我不觉得这很丑,尤其是如果您执行psData = []#一些注释解释其中的内容
Extraneon 2010年

3
不管是否丑陋,当心那些名字是如此相似:psData和pdata,mAData和msData ...
Francesco 2010年

1
-1:请勿将其替换为使用最少击键次数的“代码高尔夫球”构造。很好 任何更简洁的方法都会使想要维护该程序的人感到困惑和沮丧。确实,比这更晦涩难懂的东西都可能会改写成这个。
S.Lott

如果编码器中包含注释以解释代码行的功能,那应该就莫名其妙了,例如#初始化列表变量
CCKx

Answers:


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

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

最主要的是,不要使用类似

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

也不

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

这将使所有名称都引用相同的空列表!


@thenickname,随时乐意提供帮助!
Alex Martelli 2010年

4
很好的答案,我一直在尝试C风格的尝试,但alist, blist, clist = []直到我找到它为止一直失败
Bas Jansen 2013年

1
它也适用于字典吗?

3
是的,它也适用于字典。这就是我一直在寻找的问题,直到遇到这个问题和答案。
CCKx

感谢您的解释; 第一行是我想要的。
卢克·戴维斯

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

9

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

my_lists = collections.defaultdict(list)

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


1
感谢那!我喜欢python,它可以让我作为初学者编写有用的代码,但还具有许多高级功能,可以继续学习以改进代码。
vorpal

这是它的优点之一,也证明了Guido和语言设计的其他主要贡献者的独创性!
Francesco '10

1

更有效的方法:

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

[注意]:

  • xrange()比更优range()Python2参考

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

  • xrange()Python3未定义


事物如何比其他事物“更优化”?:)
bers

0

切记,整理可能会带来绩效的后果。范围函数调用将稍微减慢初始化过程。请注意,如果您有一些需要多次重新初始化变量的过程。

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

-1

您可以使用一个类来初始化/存储数据,这将花费更多的行,但可能更易于阅读和面向对象。

喜欢:

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

然后在主要开始附近:

data=Data()

然后在循环中或在主帖子声明中的任何位置都可以使用该类。

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

从本质上讲,这只是一个命令,它不能解决OP的问题,也不是更简单,OP显然希望更少的代码,更少的麻烦,不是那样。但是,这是解决问题的另一种类型,确实值得,但是可以做得更好,而且,您使用了一些奇怪的名称。
Inbar Rose 2012年

-5

遵循以下原则

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

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


3
alist.append("oops"); print(blist)['oops']
bers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.