Python Verschachtelte Listen und Iterationen

7

Ich bin neu bei Python und habe meine Suche durchgeführt, aber ich konnte nicht finden, wonach ich suche. Ich entschuldige mich im Voraus, wenn diese Frage gestellt wurde und ich sie nicht finden konnte, weil ich den Namen dessen, was ich erreichen wollte, nicht kannte. Ich lese gern jedes Dokument, das Sie vorschlagen könnten.

Ich habe eine Liste von Listen. z.B. = & gt; [int, 'str']

%Vor%

Ich möchte herausfinden, ob a str in der Indexposition (1) einer der Listen von Liste t existiert. Ich kann dies mit einer Funktion tun, die 2 for- oder while-Schleifen enthält, aber was ich suche, ist, dies möglichst mit einer einzigen Iteration zu erreichen. Ich möchte die kürzeste Funktion lernen.

for input str('str_3'), I want to get int(2) (Index der Liste, die str_3 an ihrem eigenen ersten Indexstandort hat) für str_1 möchte ich int (0) erhalten

und für str_1234 Ich möchte Falsch erhalten, da es in keiner der Listen in list t

enthalten ist

Als Neuling würde ich normalerweise tun:

%Vor%

Was ich erreichen will, ist, wenn möglich, ein besserer und kürzerer Weg, um dies in einer Zeile eines Codes zu erreichen oder einfach nur zu lernen, ob es einen klüger, besseren oder pythischeren Weg gibt, als irgendjemand von euch ist sicherlich erfahrener würde empfehlen.

Danke

    
Phil 18.08.2012, 15:32
quelle

4 Antworten

11
%Vor%

Erläuterung:

%Vor%

Dies wird alle übereinstimmenden Indizes zurückgeben, da es mehr als eins geben kann.

Wenn Sie wissen, dass es nur einen Index gibt, kann ich vorschlagen, ein Dict anstelle einer verschachtelten Liste zu verwenden? Mit einem Dict können Sie Elemente in konstanter Zeit mit einer sehr einfachen Syntax suchen, anstatt iterieren zu müssen.

%Vor%     
John Kugelman 18.08.2012, 15:37
quelle
7

Verwenden Sie die Funktion any mit einem Generatorausdruck:

%Vor%

Dies ist Schleife über t , und für jede el in t testen wir, ob der zweite Wert darin gleich str_1 ist, genau wie Ihre Schleife.

Aber es wird das nur tun, bis es ein Element findet, für das das wahr ist, dann stoppe und gibt True zurück. Wenn ein solches Element nicht gefunden wird, wird stattdessen False zurückgegeben.

Wenn Sie stattdessen nicht nur das Vorhandensein von str_1 testen möchten, sondern auch wissen möchten, wo es sich befindet, ist die effizienteste Methode die Verwendung einer Schleife wie bei Ihnen. Sie können enumerate verwenden, um Ihnen den Index und den Wert in einer Sequenz zu geben:

%Vor%     
Martijn Pieters 18.08.2012 15:41
quelle
3

Das Beispiel einer for-Schleife, die Sie verwenden, ist nicht die übliche Art, in python for-Schleifen zu verwenden, weil die for-Schleife kein numerisches Konstrukt ist (wie es in den meisten Sprachen der Fall ist), sondern eine Art, einen Schleifenkörper anzuwenden zu jedem Element, das durch Iteration der angegebenen Sammlung erhalten wird.

Der normale Weg (mit einer Schleife), um den Index zu finden, wäre:

%Vor%

Beachten Sie, dass in diesem Fall die Sequenzzuweisung verwendet wird, um die Elemente jeder Liste mit zwei Elementen separaten Variablen zuzuweisen. Probieren Sie die Funktion enumerate selbst in der Python-Shell aus, um herauszufinden, was sie tut.

Wenn Ihre Liste sortiert ist, können Sie stattdessen bisect : Ссылка

verwenden

Wenn Sie nur herausfinden wollen, ob es ein Paar gibt, das Ihrer Bedingung entspricht und Sie sich nicht um den Index kümmern, verwenden Sie any , was die Iteration stoppt, sobald eine Übereinstimmung gefunden wird:

%Vor%

Der Ausdruck in any ist ein Generatorausdruck , der True oder False für jedes Element in t liefert.

Betrachten Sie abschließend, ob dies die am besten geeignete Datenstruktur ist.

    
Marcin 18.08.2012 15:42
quelle
1

Lassen Sie uns zunächst eine tatsächliche Datenstruktur ähnlich der von Ihnen beschriebenen verwenden:

%Vor%

Erstellen Sie nun eine Liste von Tupeln für jedes Element, das dem Test von gleich 'str_5'

entspricht %Vor%

Testen Sie jetzt mit einer Zeichenfolge, die nicht vorhanden ist:

%Vor%

Es ist dann einfach, Präsenz zu testen, das Auftreten zu zählen und die benötigten Items zu extrahieren:

%Vor%

Wie andere bereits gesagt haben, könnten Sie Ihre Datenstruktur ändern. Behalten Sie int_x als Index? Tu das nicht. Verwenden Sie eine Liste der Zeichenfolgen und zähle auf. Wenn es sich nur um eine Zuordnung zwischen str_x und int_x handelt, verwenden Sie ein Wörterbuch.

    
the wolf 18.08.2012 16:15
quelle

Tags und Links