Python - инициализация нескольких списков / строк - PullRequest
60 голосов
/ 08 марта 2010

Это ужасно безобразно:

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

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

Ответы [ 7 ]

142 голосов
/ 08 марта 2010
alist, blist, clist, dlist, elist = ([] for i in range(5))

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

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

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

ни

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

, при котором все имена ссылаются на такой же пустой список!

21 голосов
/ 08 марта 2010
psData,nsData,msData,ckData,mAData,RData,pData = [],[],[],[],[],[],[]
9 голосов
/ 08 марта 2010

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

my_lists = collections.defaultdict(list)

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

1 голос
/ 20 октября 2018

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

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

[ Примечание ]:

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

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

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

0 голосов
/ 14 сентября 2018

Что-то вроде

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

может показаться самым элегантным решением.

0 голосов
/ 13 января 2017

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

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 голосов
/ 11 июля 2012

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

Как:

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

Тогда в основном в начале:

data=Data()

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

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