Ich versuche zu verstehen, ob es sinnvoll ist, den Inhalt einer Liste zu übernehmen und an eine andere Liste anzuhängen.
Ich habe die erste Liste durch eine Schleifenfunktion erstellt, die bestimmte Zeilen aus einer Datei herausholt und sie in einer Liste speichert.
Dann wird eine zweite Liste verwendet, um diese Zeilen zu speichern und einen neuen Zyklus über eine andere Datei zu starten.
Meine Idee war es, die Liste zu erhalten, sobald der for-Zyklus abgeschlossen ist, sie in die zweite Liste zu kopieren, dann einen neuen Zyklus zu starten, den Inhalt der ersten Liste erneut in die zweite zu kopieren, ihn aber anzuhängen, sodass die zweite Liste die ist Summe aller kleineren Listendateien, die in meiner Schleife erstellt wurden. Die Liste muss nur angehängt werden, wenn bestimmte Bedingungen erfüllt sind.
Es sieht ungefähr so aus:
# This is done for each log in my directory, i have a loop running
for logs in mydir:
for line in mylog:
#...if the conditions are met
list1.append(line)
for item in list1:
if "string" in item: #if somewhere in the list1 i have a match for a string
list2.append(list1) # append every line in list1 to list2
del list1 [:] # delete the content of the list1
break
else:
del list1 [:] # delete the list content and start all over
Ist das sinnvoll oder sollte ich einen anderen Weg gehen?
Ich brauche etwas Effizientes, das nicht zu viele Zyklen in Anspruch nimmt, da die Liste der Protokolle lang und jede Textdatei ziemlich groß ist. Also dachte ich, dass die Listen dem Zweck entsprechen würden.
In itertools.chain finden Sie eine schnelle Möglichkeit, viele kleine Listen als einzelne große Liste (oder zumindest als einzelne große iterierbare Liste) zu behandeln, ohne die kleineren Listen zu kopieren:
quelle
Das scheint ziemlich vernünftig für das, was Sie versuchen zu tun.
Eine etwas kürzere Version, die sich auf Python stützt, um mehr vom schweren Heben zu tun, könnte sein:
Das
(True for line in list1 if "string" in line)
iteriertlist
und wird ausgegeben,True
wenn eine Übereinstimmung gefunden wird.any()
verwendet die Kurzschlussauswertung, um zurückzukehrenTrue
, sobald das ersteTrue
Element gefunden wurde.list2.extend()
Hängt den Inhalt vonlist1
an das Ende an.quelle
any(True for line in list1 if "string" in line)
ist ordentlicher geschrieben alsany("string" in line for line in list1)
.any
erhält ein Generator; Es wird nirgendwo eine Liste mit wahren oder falschen Werten erstellt. Meine Version gibt mehr Dinge zurückany
, die überprüft werden sollen, aber im Gegenzug, wenn nicht die gleiche Prüfung im Generator selbst durchgeführt wird. Ich stelle mir vor, es ist eine Wäsche, aber hiertimeit
ist es maßgeblich, nicht ich. :)Sie können auch zwei Listen (z. B. a, b) mit dem Operator '+' kombinieren. Beispielsweise,
quelle
Um die vorherigen Antworten noch einmal zusammenzufassen. Wenn Sie eine Liste mit
[0,1,2]
und eine andere mit haben[3,4,5]
und diese zusammenführen möchten[0,1,2,3,4,5]
, können Sie die Unterschiede entweder verwendenchaining
oderextending
sollten sie kennen, um sie mit Bedacht für Ihre Anforderungen zu verwenden.Liste erweitern
Mit der
list
Klassenmethodeextend
können Sie eine Kopie der Elemente von einer Liste in eine andere erstellen. Dies führt jedoch zu einer zusätzlichen Speichernutzung, die in den meisten Fällen in Ordnung sein sollte, jedoch Probleme verursachen kann, wenn Sie speichereffizient sein möchten.Eine Liste verketten
Im Gegensatz dazu können Sie
itertools.chain
viele Listen verkabeln, wodurch eine so genannte Liste zurückgegeben wird, mit deriterator
die Listen durchlaufen werden können. Dies ist speichereffizienter, da keine Elemente kopiert werden, sondern nur auf die nächste Liste verwiesen wird.quelle
Verwenden der
map()
undreduce()
integrierten FunktionenMinimales "for looping" und elegantes Codierungsmuster :)
quelle
Wenn wir eine Liste wie unten haben:
zwei Möglichkeiten, es in eine andere Liste zu kopieren.
1.
2.
quelle