这是我尝试过的。我试图从列表中显示最高分的文本。但遇到错误:
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
请告诉我,在列表中获取最高分句的文本的可行方法是什么。
答案 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]