2017-04-01 4 views
0

Derzeit nimmt dies die Liste der Kandidaten und sortiert sie, so dass die Kandidaten mit dem niedrigsten Ergebnis in den ersten Positionen sind, wie würde ich bekommen es so, dass es jede Liste überprüft und wenn die Nummer im zweiten Feld nicht gleich der ersten ist, löscht es diese Liste? Ich versuche, alle Listen zu entfernen, die nicht die niedrigste oder gleich niedrigste Zahl in den Kandidaten sind [x] [1]:Wie man die Liste einer Liste sortiert und eine Liste löscht, wenn weniger nicht zuletzt Wert

candidates = [[name, 3, characteristic], [name, 7, characteristic], [name, 3, characteristic]] 

so der folgende Code sollte nur löschen Kandidaten [1]

from operator import itemgetter 

candidates.sort(key=itemgetter(1)) 

for [x][1] in candidates: 
    if candidates[x][1] != candidates[0][1] : 
     candidates.remove(candidates[x]) 

Danke!

+0

Wenn ich Sie richtig verstanden habe, könnten Sie die 'filter()' -Funktion verwenden, um dies zu tun – MoQ93

+0

Yeah war ich nicht sicher, wie man das für eine Liste einer Liste, irgendwelche Ideen zu implementieren? –

Antwort

0

Das Problem mit Ihrer Lösung ist, dass Sie die candidates Liste während der Iteration über die gleiche Liste ändern. Dies führt zu Problemen, wie Sie wahrscheinlich bemerkt haben.

Anstatt sorted() können Sie min() mit einem Schlüssel verwenden, um das Element mit dem kleinsten Wert zu bestimmen. Dies ergibt eine bessere Leistung - O (n) vs. O (n log n) - was bei einer langen Liste von Kandidaten wichtig sein könnte.

Darüber hinaus wäre es besser, den Mindestwert im Voraus zu bestimmen, ihn in einer Variablen zu speichern und ihn beim Vergleichen von Elementen in einem Listenverständnis/Filter zu verwenden. Dies vermeidet mehrere redundante Anrufe min() was zu einer effizienteren Lösung:

from operator import itemgetter 

candidates = [['name', 97, 'blah'], ['name', 7, 'candidate'], ['name', 3, 'characteristic'], ['name', 3, 'characteristic']] 

min_value = min(candidates, key=itemgetter(1))[1] 
candidates = [candidate for candidate in candidates if candidate[1] == min_value] 
print(candidates) 
# [['name', 3, 'characteristic'], ['name', 3, 'characteristic']] 

Bitte beachte, dass ich hier eine Liste Verständnis verwenden. Sie gelten als pythischer, haben möglicherweise eine bessere Leistung und können leicht in Generatorausdrücke umgewandelt werden, die in vielen Situationen auch eine bessere Leistung erbringen.

0

Sie können dies versuchen, wenn ich Ihre Bedeutung nicht falsch verstehen:

from operator import itemgetter 
candidates = [['name', 3, 'characteristic'], ['name', 7, 'characteristic'], ['name', 3, 'characteristic']] 

candidates=filter(lambda x:x[1]==sorted(candidates,key=itemgetter(1))[0][1],candidates) 

print(candidates) 

Verwenden filter() Methode, um die Unterliste zu entfernen, wenn das zweite Feld auf die niedrigste Punktzahl nicht gleich ist.

[['name', 3, 'characteristic'], ['name', 3, 'characteristic']] 

aktualisieren

Ich habe vergessen, dass Sie min() die bekommen können:

Wenn Sie Python3.x verwenden, sollten Sie list(filter(...))

Ausgang verwenden niedrigste Punktzahl, es ist ein effizienter Weg:

candidates = [['name', 3, 'characteristic'], ['name', 7, 'characteristic'], ['name', 3, 'characteristic']] 

candidates=list(filter(lambda x:x[1]==min([i[1] for i in candidates]),candidates)) 

print(candidates) 
+0

Dies gibt jetzt , irgendwelche Ideen? –

+0

@TimJames In Python3.x sollten Sie 'list (filter (...))' verwenden, um das Ergebnis in list zu konvertieren. – McGrady

+0

Dies ist nicht effizient - die Liste wird für jeden Eintrag in der Liste einmal sortiert. Sortiere einmal und speichere das Ergebnis und verwende besser 'min() '. – mhawke

Verwandte Themen