This is terribly ugly:
psData = [] nsData = [] msData = [] ckData = [] mAData = [] RData = [] pData = []
Is there a way to declare these variables on a single line?
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
alist, blist, clist, dlist, elist = ([] for i in range(5))
The downside of above approach is, you need to count the number of names on the left of = and have exactly the same number of empty lists (e.g. via the range call, or more explicitly) on the right hand
side.
The main thing is, don’t use something like
alist, blist, clist, dlist, elist = [[]] * 5
nor
alist = blist = clist = dlist = elist = []
which would make all names refer to the same empty list!
Method 2
psData,nsData,msData,ckData,mAData,RData,pData = [],[],[],[],[],[],[]
Method 3
Depending on your needs, you could consider using a defaultdict with a list factory.
Something like:
my_lists = collections.defaultdict(list)
and then you can directly append to my_lists[“psData”] and so on.
This is the relevant doc page: http://docs.python.org/library/collections.html#collections.defaultdict
Method 4
A bit more efficient approach:
alist, blist, clist, dlist, elist = ([] for _ in xrange(5))
[NOTE]:
-
xrange()is more optimal thanrange()in Python2. (Ref) -
The
ivariable was unusable so using_is better. (Ref) -
xrange()is no longer in Python3 —range()is the same withxrange().
Method 5
Bare in mind that, tidiness may come with consequences of performance. The range function call will slow down the init process slightly. Beware if you have some process that need to reinit the variable many time.
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")
Method 6
You can use a class to initialize/store the data, it would take more lines, but could be easier to read, and more object oriented.
Like:
class Data:
def __init__(self):
self.var1=[]
<etc.>
def zeroize(self):
self.var1=[]
<etc.>
Then in main near the beginning:
data=Data()
Then in your loops or anywhere in main post declaration you can use the class.
data.var1.append(varN)
if(something):
data.zeroize()
Method 7
Something along the lines of
alist, blist, clist, dlist, elist = ([],)*5
would appear to be the most elegant solution.
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0