Python列表排序导致错误

时间:2017-07-25 07:30:36

标签: python python-2.7 list

这是我尝试过的。我试图从列表中显示最高分的文本。但遇到错误:

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

请告诉我,在列表中获取最高分句的文本的可行方法是什么。

2 个答案:

答案 0 :(得分:2)

list.sort()的{​​{1}}参数应该是一个可调用的,它从列表中获取一个项并返回要排序的值,所以在你的情况下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')]

当你得到ex-aequo时,你没有得到完全相同的顺序(使用>>> data = ["foo", "bar", "baaz", "qi"] >>> d = [(len(t), t) for t in data] >>> print sorted(d) [(2, 'qi'), (3, 'bar'), (3, 'foo'), (4, 'baaz')] 函数保留原始顺序,而不是在元组中的第二个值上排序),但这是一个问题你必须解决你选择的任何解决方案。

同样,Daniel Sanchez提到,key对列表进行了排序并返回list.sort(),因此None会引发d.sort(key = score, reverse=True)[0]。如果要对列表进行排序,则必须先调用sort然后下标TypeError

d

或者您可以使用返回排序列表的内置d.sort(reverse=True) print d[0] 函数:

sorted()

答案 1 :(得分:0)

问题(除了标识?)是.sort返回None,并且您尝试通过索引访问:

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]