TypeError:' NoneType'对象不可订阅,scores.sort()

时间:2016-04-20 08:34:06

标签: sorting ipython

{{1}}

我需要对分数进行排序并在文件中写出前20个分数。上面是我的代码,我最终得到了TypeError:' NoneType'对象不可订阅

感谢。

2 个答案:

答案 0 :(得分:3)

通常情况应该是

TypeError: 'NoneType' has no attribute '__getitem__'

但是,你不能这样做:

scores.sort()[:20]

这只是因为list.sort()就地修改了列表并且没有返回任何内容(这意味着它隐式返回None)。

因此,您必须在切片操作之前将scores.sort()放在单独的语句中...

scores.append((item, score))
scores.sort()
output_file.write(scores[:20] + '\n')

...或者您使用内置方法sorted(...),该方法不会修改原始列表但返回已排序的副本。

scores.append((item, score))
output_file.write(sorted(scores)[:20] + '\n')

如果您想稍后再次访问已排序列表,则应选择第一个选项,但如果您需要选择第二个选项想要稍后再次访问未排序的列表。如果您根本不需要该列表,您可以选择任何选项。

答案 1 :(得分:1)

sort()列表方法对给定列表进行排序。它不返回新列表。这是了解您遇到的错误的关键。

官方Python documentation说:

此方法修改了在节省空间时的位置顺序 排序大序列。提醒用户它可以并行运行 效果,它不返回排序顺序

如果应用sort()方法并进行打印,它将返回None而不是已排序列表:

lst = [1,4,2,5]
print(lst.sort())
> None

当您执行scores.sort()[:20]时,您试图通过索引(也称为切片)从列表中获取项目。就像我上面显示的那样,问题是该表达式返回None,无法通过索引访问。

这就是为什么您收到错误消息的原因:

TypeError:“ NoneType”对象不可下标

这只是说NoneType对象无法建立索引。您尝试执行的操作就像:

None[:20]
> TypeError: 'NoneType' object is not subscriptable

您不能这么做,因为'NoneType'对象不可下标


如果需要新列表,则必须使用sorted() built-in function。 此功能(而不是方法)很通用。它不仅仅适用于列表,它还从可迭代对象(如列表,字符串,元组)构建新的排序列表。尽管确实会返回列表。

sorted()不会修改原始的可迭代项。它创建一个新对象:一个有序列表。


哪些对象可以在Python中下标?那些实现__getitem__和/或__setitem__ dunder方法的人。

使用__getitem__可以获得一个值,例如list[0]返回列表的第一个值。 使用__setitem__可以设置一个值,例如list[0]=1