2017-07-25 106 views
-3

這是我試過的。我正在嘗試顯示列表中最高分的文字。但遇到的錯誤:導致錯誤的Python列表排序

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] 

錯誤:

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

candidates文件是這樣的:https://gist.github.com/JafferWilson/6bdb42c94cab07cce0211582acba12eb

請讓我知道了什麼是可能的方式來獲得最高的文本在列表中評分句子。

+1

什麼關於縮進? – Nabin

+1

請修復您的縮進,併發布'''候選人''看起來像什麼。 – perigon

+0

@ user55449 sure –

回答

0

問題(?除了identation)是.sort回報無,你是指數在試圖訪問:

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

爲你所得到的錯誤,你不需要分數,它會得到默認排序,使用方法:

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

我得到了這個錯誤:'File「example.py」,第45行,在 d.sort(key = score,reverse = True)NameError:name'score'未定義 ' –

+0

觀察是正確的 - 'd .sort()[0]'確實會引發錯誤 - 但這不是OP試圖解決ATM的問題。 –

+0

@brunodesthuilliers,是的,我意識到很晚,感謝指出:) – Netwave

2

list.sort()key的說法應該是一個可調用的,從列表中接受一個項目並返回其上的值進行排序,所以你的情況key應該事端摹狀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')] 

但你其實並不需要在這裏它,因爲一個元組列表自然會元組(然後在第二個的第一項進行排序,如果有項目,其第一價值是平等的等):

​​

當你前aequo(帶key功能原來的順序被保留你沒有得到完全相同的排序,沒有它得到的元組的第二個值排序),但這是一個問題,您必須解決您選擇的任何解決方案。

又如丹尼爾桑切斯提到,list.sort()排序清單到位並返回None,所以d.sort(key = score, reverse=True)[0]將提高TypeError。如果要排序的位置列表中,您必須先調用排序,然後下標d

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

或者你可以使用內置的sorted()函數返回一個排序列表:

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

但我的列表中有兩個鍵。一個是文本,另一個是浮點數。然後我可以如何分類。我只需要對浮點數進行排序並返回文本。 –

+0

這就是'sort()'(和'sorted()')將會執行_without_key''參數 - 對元組的第一項進行排序。 _only_不同之處在於兩個項目具有完全相同的分數 - 使用'key'函數時,這些項目將保持原始排序,而不會將它們排序在元組的第二部分。 –