2017-10-12 5 views
0

Alle mit Länge,Python: Einfügen in eine Liste als Index

Ich habe vor kurzem Python aufgenommen und derzeit in dem Prozess mit Listen umzugehen. Ich benutze eine Testdatei, die mehrere Zeilen von Zeichen enthält, die durch einen Tab eingerückt sind und dann dieses in mein Python-Programm weiterleiten. Das Ziel meines Python-Skripts ist es, jede Zeile in eine Liste einzufügen, wobei die Länge als Index verwendet wird, was bedeutet, dass die Liste automatisch sortiert wird. Ich denke über den grundlegendsten Fall nach und mache mir keine Gedanken über komplizierte Fälle.

Mein Python-Code unten;

newList = [] 

for line in sys.stdin: 
    data = line.strip().split('\t') 
    size = len(data) 
    newList.insert(size, data) 
for i in range(len(newList)): 
    print (newList[i]) 

Meine 'Test' Datei unten;

2 2 2 2 
1 
3 2 
2 3 3 3 3 
3 3 3 

Meine Erwartung der Ausgabe des Python-Skript ist, den Inhalt der Liste in der folgenden Reihenfolge sortiert nach Länge zu drucken;

['1'] 
['3', '2'] 
['3', '3', '3'] 
['2', '2', '2', '2'] 
['2', '3', '3', '3', '3'] 

Wenn ich jedoch meine Testdatei an mein Python-Skript übergeben, bekomme ich Folgendes;

cat test | ./listSort.py 
['2', '2', '2', '2'] 
['1'] 
['3', '2'] 
['3', '3', '3'] 
['2', '3', '3', '3', '3'] 

Die erste Zeile des Ausgangs [ '2', '2', '2', '2'] ist falsch. Ich versuche herauszufinden, warum es nicht in der 4. Zeile gedruckt wird (wegen Länge 4 würde es bedeuten, dass es in den 4. Index der Liste eingefügt worden wäre). Könnte jemand bitte einen Einblick geben, warum das so ist? Mein Verständnis ist, dass ich jede 'Daten' in die Liste einfügen werde, wobei 'Größe' als Index verwendet wird, was bedeutet, dass wenn ich den Inhalt der Liste ausdrücke, sie in sortierter Reihenfolge gedruckt werden würden.

Vielen Dank im Voraus!

+3

Versuchen Sie, Ihren Algorithmus zu wiederholen Stift & Papier und Sie werden sehen, warum das Ergebnis falsch ist. – mkrieger1

+1

Beachten Sie auch die "nutzlose Verwendung von cat": 'cat filename | Programm 'ist dasselbe wie' Programm mkrieger1

+2

Oder wenn Ihr Verständnis von Listen falsch ist, dann hilft Ihnen die Verwendung von Stift & Papier vielleicht nicht ... Die Sache ist, dass wenn Sie eine Liste von Länge * N * haben, etwas in den Index * n *> * N * einfügen Hängen Sie es an das Ende der Liste an. Z.B. Das Einfügen von "x" in eine leere Liste (* N * = 0) bei Index "4" führt nur zu einer Liste "[x]", nicht etwa wie "[-, -, -, -, x]". – mkrieger1

Antwort

3

Einfügen in Listen arbeiten ganz anders als das, was Sie denken:

>>> newList = [] 
>>> newList.insert(4, 4) 
>>> newList 
[4] 
>>> newList.insert(1, 1) 
>>> newList 
[4, 1] 
>>> newList.insert(2, 2) 
>>> newList 
[4, 1, 2] 
>>> newList.insert(5, 5) 
>>> newList 
[4, 1, 2, 5] 
>>> newList.insert(3, 3) 
>>> newList 
[4, 1, 2, 3, 5] 
>>> newList.insert(0, 0) 
>>> newList 
[0, 4, 1, 2, 3, 5] 

Hoffentlich Sie zwei Dinge aus diesem Beispiel sehen kann:

  • Die Liste Indizes sind 0-basiert. Das heißt, der erste Eintrag Index 0 hat, hat der zweite Index 1 usw.
  • list.insert(idx, val) Einsätze Dinge in die Position, die derzeit Index hat idx, und Stösse alles danach eine Position nach unten. Wenn idx größer als die aktuelle Länge der Liste ist, wird das neue Element automatisch an der letzten Position hinzugefügt.

Es gibt mehrere Möglichkeiten, um die Funktionalität, die Sie implementieren möchten:

  1. Wenn Sie die Anzahl der Zeilen vorhersagen können, können Sie die Liste vorab zuweisen, und einfach auf die Elemente der Liste zuweisen statt das Einsetzen:

    newList = [None] * 5 
    
    for line in sys.stdin: 
        data = line.strip().split('\t') 
        size = len(data) 
        newList[size - 1] = data 
    for i in range(len(newList)): 
        print (newList[i]) 
    

    Wenn Sie eine angemessene Obergrenze der Anzahl der Zeilen vorhersagen können, können Sie dies auch tun, aber Sie müssen eine Möglichkeit haben, um die None Einträge danach zu entfernen.

  2. Verwenden Sie ein Wörterbuch:

    newList = {} 
    
    for line in sys.stdin: 
        data = line.strip().split('\t') 
        size = len(data) 
        newList[size - 1] = data 
    for i in range(len(newList)): 
        print (newList[i]) 
    
  3. Elemente In der Liste als notwendig, die wahrscheinlich ein bisschen mehr beteiligt ist:

    newList = [] 
    
    for line in sys.stdin: 
        data = line.strip().split('\t') 
        size = len(data) 
        if len(newList) < size: newList.extend([None] * (size - len(newList))) 
        newList[size - 1] = data 
    for i in range(len(newList)): 
        print (newList[i]) 
    
+0

Vielen Dank für die hervorragende und detaillierte Erklärung! – Triple777er

1

Ich glaube, ich habe die Antwort auf meine Frage herausgefunden, dank mkrieger1. Ich füge an die Liste an und sortiere sie dann mit der Länge als Schlüssel;

newList = [] 

for line in sys.stdin: 
    data = line.strip().split('\t') 
    newList.append(data) 
newList.sort(key=len) 
for i in range(len(newList)): 
    print (newList[i]) 

Ich habe den Ausgang, den ich wollte;

/listSort.py < test 
['1'] 
['3', '2'] 
['3', '3', '3'] 
['2', '2', '2', '2'] 
['2', '3', '3', '3', '3'] 
+1

Sie müssen die Liste nicht jedes Mal sortieren, nachdem Sie alle Daten hinzugefügt haben. –

+0

Ja, ich habe versehentlich die Sorte eingerückt. Bearbeitete die Antwort so, dass die Sortierung nach dem Anhängen aller Daten erfolgt. – Triple777er

Verwandte Themen