调用Python sorted()对列表排序触发‘list object is not callable’报错排查
问题排查与修复
1. 排序触发TypeError的原因
这个报错'list' object is not callable是典型的IPython/Jupyter环境变量污染问题:
你之前在别的单元格写代码的时候,不小心把变量名取成了内置函数sorted,比如写过sorted = []这类语句,把Python本来的内置排序函数给覆盖成了列表对象。等你当前单元格运行sorted(swap_avg_by_hour, reverse=True)的时候,实际是在给一个列表值加括号调用,自然会报类型错误。
修复直接操作即可:
- 临时恢复:在当前单元格最前面加一句
import builtins; sorted = builtins.sorted,把内置的sorted函数重新赋值回来。修复完成后你可以正常使用sorted()做排序,不需要替换成list.sort()方法 - 一劳永逸:直接重启Notebook内核,从头按顺序跑代码,之后命名变量别用sorted、list、sum这类内置关键字
- 验证方法:跑一句
print(type(sorted)),输出<class 'builtin_function_or_method'>就说明恢复正常了
2. 代码内存在的其他逻辑/语法问题
逐行过了一遍代码,有几个哪怕解决了sorted的问题,跑到后面也会报错或者计算结果不对的点:
- 目标列表未初始化:你代码里直接对
avg_by_hour、swap_avg_by_hour做append操作,但当前这段代码里从来没给这俩变量赋值成空列表。之前你能跑到排序那步,大概率是之前的单元格里偷偷把这俩变量定义成列表了,换环境跑肯定会报NameError。运行前记得补两句初始化:avg_by_hour = [] swap_avg_by_hour = [] - 平均评论数计算逻辑错误:你累加完ask类帖子的总数后,没把计数变量
total重置为0,就直接开始算show类帖子的平均评论数。这会把ask帖子的数量也算进show评论的分母里,算出来的avg_show_comments数值完全不对。正确流程是算完avg_ask_comments之后,把total清0再进入show帖子的遍历:avg_ask_comments = total_ask_comments/total print(avg_ask_comments) # 补这行重置计数 total = 0 for row in show_posts: total += 1 num_comments = int(row[4]) total_show_comments += num_comments avg_show_comments = total_show_comments/total - 文件路径兼容性问题:
open("hacker_news.csv")的写法,只有当csv文件和当前脚本/Notebook的工作目录完全重合的时候才能读到,不然会直接抛FileNotFoundError。
3. CSV文件上传操作指引
对应不同的常见使用场景,操作步骤非常直接,没有复杂入口:
- 本地编写代码(VS Code/PyCharm的Jupyter环境):直接把
hacker_news.csv放到你当前打开的项目根目录,和存代码的.ipynb/.py文件放同一个文件夹即可,原有读取代码不用改动 - 在线Notebook环境:找到左侧边栏的文件夹形状的「文件」按钮,点进去找带向上箭头的「上传」图标,选中本地的
hacker_news.csv等待上传完成,文件会自动存在当前环境的根目录下,原有读取代码就能正常运行 - 路径验证方法:跑一句
import os; print(os.listdir()),输出的列表里能看到hacker_news.csv就说明文件位置正确
内容的提问来源于stack exchange,提问作者user15825995
相关产品推荐
相关产品推荐

