2017-07-25 3 views
-3

Hier ist, was ich versucht habe. Ich versuche, den Text der höchsten Punktzahl aus der Liste anzuzeigen. Aber die Begegnung mit dem Fehler:Python-Liste Sortierung verursacht Fehler

for cscore, text in candidates: 
    score = cscore/len(text) 
     d = [round(score, 3), ' '.join([u[0] for u in text])]    
     print d.sort(key = score, reverse=True)[0] 

Fehler:

File "example.py", line 47, in <module> 
    print d.sort(key = score, reverse=True)[0] 
NameError: name 'score' is not defined 

Meine candidates Datei sieht wie folgt aus: https://gist.github.com/JafferWilson/6bdb42c94cab07cce0211582acba12eb

Bitte, lassen Sie mich wissen, was die Art und Weise, ist der Text der höchsten zu erhalten Punktzahl in der Liste.

+1

Was über die Einrückung? – Nabin

+1

Bitte korrigieren Sie Ihre Einrückung und posten Sie, wie '' 'Kandidaten' 'aussieht. – perigon

+0

@ user55449 sure –

Antwort

0

Das Problem (? Abgesehen von identation) ist, dass .sort kehrt None, und Sie versuchen, einen Index für den Zugriff auf:

print d.sort(key = score, reverse=True)[0] 

für den Fehler, den Sie bekommen, müssen Sie nicht die Partitur benötigen, wird es erhalten standardmäßig sortiert, verwenden:

for cscore, text in candidates: 
    score = cscore/len(text) 
    d = [round(score, 3), ' '.join([u[0] for u in text])]    
    d.sort(reverse=True) 
    print d[0] 
+0

Ich habe diesen Fehler: 'Datei" example.py ", Zeile 45, in d.Sort (key = score, reverse = True) NameError: Name 'score' ist nicht definiert ' –

+0

Die Beobachtung ist richtig - 'd .sort() [0] 'wird in der Tat einen Fehler auslösen - aber das ist nicht das Problem, das der OP versucht, ATM zu lösen. –

+0

@brunodesthuilliers, yep, merke ich spät, danke für das Zeigen :) – Netwave

2

list.sort() ‚s key Argument soll ein aufrufbar sein, die ein Element aus der Liste nimmt und gibt den Wert, auf dem sortieren, so in Ihrem Fall key sollte somethin sein g wie lambda item: item[0]:

>>> data = ["foo", "bar", "baaz", "qi"] 
>>> d = [(len(t), t) for t in data] 
>>> print sorted(d, , key=lambda item: item[0]) 
[(2, 'qi'), (3, 'foo'), (3, 'bar'), (4, 'baaz')] 

Aber Sie brauchen es eigentlich nicht hier, da eine Liste von Tupeln wird natürlich auf den ersten Punkt des Tupels sortiert werden (dann auf der zweiten, wenn es Elemente, die equals ersten Werte usw.):

>>> data = ["foo", "bar", "baaz", "qi"] 
>>> d = [(len(t), t) for t in data] 
>>> print sorted(d) 
[(2, 'qi'), (3, 'bar'), (3, 'foo'), (4, 'baaz')] 

Sie erhalten nicht genau die gleiche Reihenfolge, wenn Sie ex-aequo erhalten (mit einer key Funktion der ursprüngliche Reihenfolge beibehalten wird, ohne dass es auf dem zweiten Wert in dem Tupel sortiert wird), Aber das ist ein Problem, das Sie ansprechen müssen, egal welche Lösung Sie wählen.

Auch wie Daniel Sanchez erwähnt, list.sort() sortiert die Liste an Ort und Stelle None zurück, so d.sort(key = score, reverse=True)[0] wird eine TypeError erhöhen. Wenn Sie die Liste an seinem Platz sortieren möchten, werden Sie zum ersten Anruf haben sortieren dann d SUBSCRIPT:

d.sort(reverse=True) 
print d[0] 

Oder können Sie die eingebaute sorted() Funktion verwenden, die eine sortierte Liste zurückgibt:

print sorted(d, reverse=True)[0] 
+0

Aber es gibt zwei Schlüssel in meiner Liste. Einer ist Text und ein anderer ist Float-Score. Dann, wie kann ich es sortieren. Ich muss nur den Float Score sortieren und den Text zurückgeben. –

+0

Das ist, was 'sort()' (und 'sorted()') _without_ das Argument 'key' tun - nach dem ersten Element des Tupels sortieren. Der einzige Unterschied besteht darin, dass zwei Elemente genau die gleiche Punktzahl haben - mit einer "Schlüssel" -Funktion behalten diese Elemente die ursprüngliche Reihenfolge bei, ohne dass sie im zweiten Teil des Tupels sortiert werden. –