2017-12-29 11 views
0

Ich habe ein Array (Liste?), Wie unten, die das Ergebnis einer SQL-Abfrage ist.Finden Sie Artikel im Array von SQL-Abfrage zurückgegeben

lstLineRouteKey = [('1203/1000/2', 1, 'DVN 1000'), ('1212/1000/2', 2, 'RKS 1000'), ('1189/1000/2', 3, 'USH 1000'), ('1201/1000/2', 4, 'ANA 1000'), ('1232/1000/2', 5, 'CLB 1000'), ('1207/1000/2', 6, 'HRY 1000'), ('1162/1000/2', 7, 'LBR 1000')] 

Was ich versuche, die erste (nur) Instanz von ‚1212/1000/2‘ zu tun ist, zu finden und den Wert rechts davon, 2 abgerufen werden.

Ich habe es mit einer for-Schleife geschafft, aber es ist sehr ineffizient, da es die gesamte Liste durchläuft, selbst nachdem es eine Übereinstimmung gefunden hat.

for id,row in enumerate(lstLineRouteKey): 
        lst = list(row) 
        for id,s in enumerate(lst): 
         if lst[0] == '1212/1000/2': 
          ID = str(lst[1]); 

Ich habe mit den Methoden nicht erfolgreich gewesen (.find, .map) Ich habe bisher gefunden, da keine der Listen über meine Struktur ähneln. Hilfe wird sehr geschätzt!

Antwort

2

Also, du bist auf der Suche nach der ersten Rekord zu einigen Bedingungen? Sie können das mit next tun.

>>> next(x[1] for x in lstLineRouteKey if x[0] == '1212/1000/2') 
2 

Der Vorteil next ist, dass es sehr effizient ist. Es wird den Generatorausdruck erschöpfen und den ersten Wert zurückgeben, der diesen Ausdruck erfüllt. next wird nicht über die gesamte Liste iterieren, wenn dies nicht erforderlich ist.

Um zu visualisieren, was passiert, betrachten Sie ein Listenverständnis des Formulars y = [x[1] for x in lstLineRouteKey if x[0] == '1212/1000/2'] Erzeugen einer Liste von K-Elementen. In diesem Fall würde next den Wert y[0] zurückgeben. In Wirklichkeit ist die Zwischenliste nicht generiert! Deshalb ist es effizient.


Wenn es eine Möglichkeit gibt, dass der Datensatz nicht existiert, kann next eine StopIteration erhöhen. Übergeben Sie in diesem Fall ein Standardargument an next. Hier ist ein Beispiel

>>> print(next((x[1] for x in lstLineRouteKey if x[0] == '1212/1000/3'), None)) 
None 
+0

Danke COLDSPEED, das hat funktioniert! – vvPULSEvv

+0

@vvPULSEvv Gern geschehen. Wenn Sie diese Antwort erhalten haben, können Sie sie als akzeptiert markieren, indem Sie auf den grauen Haken klicken, um ihn grün zu schalten. –

+0

Zeichenfolge var = str (Schrank); So hart funktioniert die Codierung der Zeichenfolge "1212/1000/2", aber ich kann keine String-Variable anstelle davon übergeben. Ich bekomme weiterhin einen Namen 'string var' ist nicht definiert. – vvPULSEvv

1

Alles, was Sie brauchen, ist break Aussage:

Es beendet die nächste einschließende Schleife, die optionale else-Klausel übersprungen, wenn die Schleife einen hat.

Sie können es in Ihrem Code verwenden wie:

lstLineRouteKey = [('1203/1000/2', 1, 'DVN 1000'), ('1212/1000/2', 2, 'RKS 1000'), ('1189/1000/2', 3, 'USH 1000'), ('1201/1000/2', 4, 'ANA 1000'), ('1232/1000/2', 5, 'CLB 1000'), ('1207/1000/2', 6, 'HRY 1000'), ('1162/1000/2', 7, 'LBR 1000')] 

my_result = None 

for line_route in lstLineRouteKey: 
    if line_route[0] == '1212/1000/2': 
     my_result = line_route[1] 
     break # on reaching here, your for loop will be terminated 
       # (no further execution) 
+1

@srig Danke!Ja, genau das meinte ich: D –

+0

Es fiel mir auf, weil ich die gleiche Antwort hatte. Egal :) – srig

+1

Danke Moinuddin Quadri! – vvPULSEvv

0

Sobald Sie das Element am Index [0] in einem tuple finden entspricht Ihre Abfrage, Sie [1]-ID den Wert am Index zuordnen können und ausbrechen der Schleife.

lstLineRouteKey = [('1203/1000/2', 1, 'DVN 1000'), ('1212/1000/2', 2, 'RKS 1000'), ('1189/1000/2', 3, 'USH 1000'), ('1201/1000/2', 4, 'ANA 1000'), ('1232/1000/2', 5, 'CLB 1000'), ('1207/1000/2', 6, 'HRY 1000'), ('1162/1000/2', 7, 'LBR 1000')] 

ID = '' 

for x, y, z in lstLineRouteKey: 
    if x == '1212/1000/2': 
     ID = str(y) 
     break