web-dev-qa-db-ja.com

Python-複数のリスト/行の初期化

これはひどくいです:

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

これらの変数を1行で宣言する方法はありますか?

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

上記のアプローチの欠点は、=の左側にある名前の数を数え、同じ数の空のリストを持つ必要があることです(たとえば、range呼び出し、またはより明示的に)右側。

主なものは、do n'tのようなものを使用することです

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

また

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

すべての名前がsame空のリストを参照するようになります!

145
Alex Martelli
psData,nsData,msData,ckData,mAData,RData,pData = [],[],[],[],[],[],[]
21
YOU

ニーズに応じて、リストファクトリでdefaultdictを使用することを検討できます。何かのようなもの:

my_lists = collections.defaultdict(list)

そして、my_lists ["psData"]などに直接追加できます。これは関連するドキュメントページです: http://docs.python.org/library/collections.html#collections.defaultdict

9
Francesco

もう少し効率的なアプローチ:

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

[[〜#〜] note [〜#〜]]:

  • xrange()は、Python2range()よりも最適です。 参照

  • i変数は使用できなかったため、___を使用することをお勧めします。 参照

  • xrange()Python3で定義されていません。

1
Benyamin Jafari

整頓は、パフォーマンスの結果を伴う場合があることに留意してください。範囲関数呼び出しは、初期化プロセスをわずかに遅くします。変数を何度も再初期化する必要があるプロセスがある場合は注意してください。

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