Python列表比较时出现'NoneType' object has no attribute 'sort'错误求助
解决你的Codewars平方列表比较问题
嘿,我来帮你搞定这个问题!你遇到的AttributeError: 'NoneType' object has no attribute 'sort'其实是个很常见的Python列表操作小坑,咱们一步步拆解修复:
错误根源
list.sort()是原地排序方法,它的返回值是None。你写的a2_sorted = a2.sort()会把a2_sorted赋值成None,后续拿它和排序后的new_list比较本质是拿列表和None对比,完全不符合逻辑;如果a2本身是None的话,调用a2.sort()还会直接触发报错。
另外,原代码没考虑两个列表长度不一致的情况——如果长度不一样,那肯定不可能满足“b是a元素的平方”这个条件,应该提前返回False。
修复后的代码
def comp(a1, a2): # 先处理边界情况:任一列表为None,或者长度不等,直接返回False if a1 is None or a2 is None or len(a1) != len(a2): return False # 生成a1所有元素的平方列表,用列表推导式更简洁 squared_a1 = [num ** 2 for num in a1] # 用sorted()生成排序后的新列表,直接比较即可 return sorted(squared_a1) == sorted(a2) # 测试你的示例用例 print(comp(a1=[121, 144, 19, 161, 19, 144, 19, 11], a2=[11 * 11, 121 * 121, 144 * 144, 19 * 19, 161 * 161, 19 * 19, 144 * 144, 19 * 19]))
关键修复细节
- 替换
sort()为sorted():sorted()函数会返回一个全新的排序后的列表,不会修改原列表,这样我们可以直接拿两个排序后的列表做相等比较,彻底避免了None的问题。 - 增加边界检查:提前过滤掉
None输入和长度不一致的情况,既符合题目逻辑,也能避免很多运行时错误。 - 简化平方列表生成:用列表推导式
[num**2 for num in a1]代替循环+append,这是Python中更简洁高效的写法。
这样修改后,你的代码就能正确处理所有测试用例啦,包括之前出错的情况~
内容的提问来源于stack exchange,提问作者Inan Inqn
相关产品推荐
相关产品推荐

