{{1}}
我需要对分数进行排序并在文件中写出前20个分数。上面是我的代码,我最终得到了TypeError:' NoneType'对象不可订阅
感谢。
答案 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()
列表方法对给定列表进行排序。它不返回新列表。这是了解您遇到的错误的关键。
此方法修改了在节省空间时的位置顺序 排序大序列。提醒用户它可以并行运行 效果,它不返回排序顺序。
如果应用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
。