Python - Инициализация нескольких списков/строк

Это ужасно уродливо:

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

Есть ли способ объявить эти переменные в одной строке?

Ответ 1

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

Недостатком вышеуказанного подхода является то, что вам нужно подсчитать количество имен слева от = и иметь точно такое же количество пустых списков (например, через вызов range или более явно) справа рука боковая сторона.

Главное, не использовать что-то вроде

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

ни

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

в котором все имена будут относиться к пустующему списку same!

Ответ 2

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

Ответ 3

В зависимости от ваших потребностей вы можете рассмотреть использование defaultdict со списком factory. Что-то вроде:

my_lists = collections.defaultdict(list)

а затем вы можете напрямую добавить my_lists [ "psData" ] и так далее. Это соответствующая страница документа: http://docs.python.org/library/collections.html#collections.defaultdict

Ответ 4

Немного более эффективный подход:

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

[ ПРИМЕЧАНИЕ ]:

  • xrange() является более оптимальным, чем range() в Python2. (Ссылка)

  • Переменная i была непригодна, поэтому лучше использовать _. (Ссылка)

  • xrange() не определен в Python3.

Ответ 5

Упомяните, что чистота может иметь последствия производительности. Вызов функции диапазона немного замедлит процесс инициализации. Остерегайтесь, если у вас есть какой-то процесс, который нужно повторно использовать переменную много раз.

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

Ответ 6

Вы можете использовать класс для инициализации/хранения данных, для этого потребуется больше строк, но их можно будет легко читать и больше ориентировать на объекты.

Как

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

Затем в начале в начале:

data=Data()

Затем в ваших циклах или в любом месте объявления основного сообщения вы можете использовать класс.

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

Ответ 7

Что-то вроде

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

было бы самым элегантным решением.