it-swarm.com.de

Python: Nimm den Inhalt einer Liste und füge ihn an eine andere Liste an

Ich versuche zu verstehen, ob es sinnvoll ist, den Inhalt einer Liste an eine andere Liste anzuhängen.

Ich habe die erste Liste durch eine Schleifenfunktion erstellt, die bestimmte Zeilen aus einer Datei erhält und sie in einer Liste speichert.

Dann wird eine zweite Liste verwendet, um diese Zeilen zu speichern und einen neuen Zyklus über einer anderen Datei zu starten.

Meine Idee war es, die Liste zu erhalten, sobald der for-Zyklus abgeschlossen ist, in die zweite Liste zu kopieren, dann einen neuen Zyklus zu starten, den Inhalt der ersten Liste erneut in die zweite zu legen, aber anzufügen, so dass die zweite Liste die ist Summe aller kleineren Listendateien, die in meiner Schleife erstellt wurden. Die Liste muss nur angefügt werden, wenn bestimmte Bedingungen erfüllt sind. 

Es sieht so ähnlich 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 nehmen würde, da die Liste der Protokolle lang ist und jede Textdatei ziemlich groß ist. Also dachte ich, dass die Listen den Zweck erfüllen würden.

154
user1006198

Du willst wahrscheinlich

list2.extend(list1)

anstatt

list2.append(list1)

Hier ist der Unterschied:

>>> a = range(5)
>>> b = range(3)
>>> c = range(2)
>>> b.append(a)
>>> b
[0, 1, 2, [0, 1, 2, 3, 4]]
>>> c.extend(a)
>>> c
[0, 1, 0, 1, 2, 3, 4]

Da list.extend() eine beliebige Iteration akzeptiert, können Sie diese auch ersetzen

for line in mylog:
    list1.append(line)

durch

list1.extend(mylog)
286
Sven Marnach

Werfen Sie einen Blick auf itertools.chain, um eine schnelle Möglichkeit zu finden, viele kleine Listen als eine einzige große Liste (oder zumindest als eine einzige große iterable) zu behandeln, ohne die kleineren Listen zu kopieren:

>>> import itertools
>>> p = ['a', 'b', 'c']
>>> q = ['d', 'e', 'f']
>>> r = ['g', 'h', 'i']
>>> for x in itertools.chain(p, q, r):
        print x.upper()
11

Das scheint ziemlich vernünftig für das, was Sie zu tun versuchen.

Eine etwas kürzere Version, die sich auf Python stützt, um mehr Gewicht zu bekommen, könnte sein:

for logs in mydir:

    for line in mylog:
        #...if the conditions are met
        list1.append(line)

    if any(True for line in list1 if "string" in line):
        list2.extend(list1)
    del list1

    ....

Der (True for line in list1 if "string" in line) durchläuft list und gibt True aus, wenn eine Übereinstimmung gefunden wird. any() verwendet die Kurzschlussbewertung, um True zurückzugeben, sobald das erste True-Element gefunden wird. list2.extend() hängt den Inhalt von list1 am Ende an.

3
Kirk Strauser

Um die vorherigen Antworten zusammenzufassen. Wenn Sie eine Liste mit [0,1,2] und eine andere mit [3,4,5] haben und diese zusammenführen möchten, so wird [0,1,2,3,4,5], können Sie entweder chaining oder extending verwenden und sollten die Unterschiede kennen, um sie sinnvoll für Ihre Anforderungen zu verwenden.

Liste erweitern

Mit der Methode list classes extend können Sie die Elemente von einer Liste in eine andere kopieren. Dies führt jedoch zu einer zusätzlichen Speicherauslastung, die in den meisten Fällen in Ordnung sein sollte, kann jedoch Probleme verursachen, wenn Sie speichereffizient sein möchten.

a = [0,1,2]
b = [3,4,5]
a.extend(b)
>>[0,1,2,3,4,5]

 enter image description here

Verkettung einer Liste

Im Gegensatz dazu können Sie itertools.chain verwenden, um viele Listen zu verknüpfen, die eine so genannte iterator zurückgeben, die zum Durchlaufen der Listen verwendet werden kann. Dies ist speichereffizienter, da keine Elemente kopiert werden, sondern nur auf die nächste Liste gezeigt wird.

from itertools import chain
a = [0,1,2]
b = [3,4,5]
c = itertools.chain(a, b)

 enter image description here

Erstellen Sie einen Iterator, der Elemente vom ersten iterierbaren Element zurückgibt, bis er erschöpft ist, und dann mit dem nächsten iterierbaren Element fortfahren, bis alle iterierbaren Elemente erschöpft sind. Wird verwendet, um aufeinanderfolgende Sequenzen als einzelne Sequenz zu behandeln. 

2
user1767754

Verwenden der integrierten Funktionen map() und reduce()

def file_to_list(file):
     #stuff to parse file to a list
     return list

files = [...list of files...]

L = map(file_to_list, files)

flat_L = reduce(lambda x,y:x+y, L)

Minimales "zum Schleifen" und elegantes Codiermuster :)

2
pX0r

Wenn wir eine Liste wie unten haben: 

list  = [2,2,3,4]

zwei Möglichkeiten, um es in eine andere Liste zu kopieren.

1.

x = [list]  # x =[] x.append(list) same 
print("length is {}".format(len(x)))
for i in x:
    print(i)
length is 1
[2, 2, 3, 4]

2.

x = [l for l in list]
print("length is {}".format(len(x)))
for i in x:
    print(i)
length is 4
2
2
3
4
0
Avinash

Sie können auch zwei Listen (z. B. a, b) mit dem Operator '+' kombinieren. Zum Beispiel,

a = [1,2,3,4]
b = [4,5,6,7]
c = a + b

Output:
>>> c
[1, 2, 3, 4, 4, 5, 6, 7]
0