Python - Initialisieren mehrerer Listen / Zeilen


77

Das ist schrecklich hässlich:

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

Gibt es eine Möglichkeit, diese Variablen in einer einzelnen Zeile zu deklarieren?


1
Ich glaube nicht , es ist hässlich, vor allem , wenn Sie tun psData = [] # Einige Kommentar zu erklären , was ist da drin
extraneon

3
Hässlichkeit oder nicht, hüte dich vor den Namen, die einander so ähnlich sind: psData und pdata, mAData und msData ...
Francesco

1
-1: Ersetzen Sie dies nicht durch eine "Code Golf" -Konstruktion, die die minimale Anzahl von Tastenanschlägen verwendet. Das ist nett. Alles, was knapper ist, wird Leute verwirren und frustrieren, die dieses Programm beibehalten möchten. In der Tat wird alles, was dunkler ist als dies, wahrscheinlich umgeschrieben.
S.Lott

Es sollte nicht verwirrend sein, wenn der Codierer einen Kommentar enthält, um zu erklären, was die Codezeile tut, wie z. B. #
Listenvariablen

Antworten:


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

Der Nachteil des obigen Ansatzes ist, dass Sie die Anzahl der Namen links von =und genau die gleiche Anzahl leerer Listen (z. B. über den rangeAnruf oder expliziter) auf der rechten Seite zählen müssen.

Die Hauptsache ist, verwenden Sie nicht so etwas

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

Noch

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

was dazu führen würde, dass sich alle Namen auf dieselbe leere Liste beziehen !


@thenickname, immer gerne helfen!
Alex Martelli

4
Tolle Antwort, ich habe versucht, den C-Stil zu machen alist, blist, clist = []und bin gescheitert, bis ich das gefunden habe
Bas Jansen

1
Gilt das auch für Wörterbücher?
Vom

3
Ja, dies gilt auch für Wörterbücher. Das habe ich gesucht, bis ich auf diese Frage und Antwort gestoßen bin.
CCKx

Danke für die Erklärung; Die erste Zeile ist das, wonach ich gesucht habe.
Luke Davis

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

9

Abhängig von Ihren Anforderungen können Sie ein Standarddiktat mit einer Listenfactory verwenden. Etwas wie:

my_lists = collections.defaultdict(list)

und dann können Sie direkt an my_lists ["psData"] und so weiter anhängen. Dies ist die relevante Dokumentseite: http://docs.python.org/library/collections.html#collections.defaultdict


1
Dank dafür! Ich finde es toll, dass ich mit Python als Anfänger nützlichen Code schreiben kann, aber auch so viele erweiterte Funktionen habe, dass ich immer wieder lernen kann, meinen Code zu verbessern.
vorpal

Das ist eine seiner Stärken und ein Beweis für den Einfallsreichtum von Guido und der anderen Hauptverantwortlichen für das Sprachdesign!
Francesco

1

Ein bisschen effizienterer Ansatz:

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

[ HINWEIS ]:

  • xrange()ist optimaler als range()in Python2 . ( Ref )

  • Die iVariable war unbrauchbar, daher ist die Verwendung _besser. ( Ref )

  • xrange()ist in Python3 nicht definiert .


Wie kann etwas "optimaler" sein als etwas anderes? :)
Bers

0

Bedenken Sie jedoch, dass Ordnung mit den Folgen der Leistung verbunden sein kann. Der Bereichsfunktionsaufruf verlangsamt den Init-Prozess geringfügig. Seien Sie vorsichtig, wenn Sie einen Prozess haben, der die Variable viele Male neu starten muss.

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

Sie können eine Klasse verwenden, um die Daten zu initialisieren / zu speichern. Dies würde mehr Zeilen erfordern, könnte jedoch einfacher zu lesen und objektorientierter sein.

Mögen:

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

Dann hauptsächlich am Anfang:

data=Data()

Dann können Sie in Ihren Schleifen oder irgendwo in der Hauptpostdeklaration die Klasse verwenden.

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

Dies ist im Wesentlichen auch nur ein Diktat - es löst weder die Frage des OP, noch ist es einfacher, das OP wollte eindeutig weniger Code und weniger Ärger, das ist es nicht. Dies ist jedoch eine andere Art der Lösung des Problems, die etwas verdient, aber es kann viel besser gemacht werden, außerdem haben Sie einige seltsame Namen verwendet.
Inbar Rose

-5

Etwas in der Art von

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

scheint die eleganteste Lösung zu sein.


3
alist.append("oops"); print(blist): ['oops'].
Bers
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.