如何将嵌套列表转为扁平列表?请排查我的Python代码错误
嵌套列表扁平化代码的问题分析
我们需要实现一个能将嵌套整数列表扁平化的迭代器,输入嵌套列表后逐个输出扁平化后的整数。先看你给出的代码:
def eb34(list1): flat_list = [] for i in range(len(list1)): if type(list[i]) == list: flat_list += flatten(list1[i]) else: flat_list.append(list1[i]) return flat_list
这段代码存在以下几个问题:
- 函数名与递归调用不匹配:函数定义的名字是
eb34,但递归调用时用了flatten,运行时会触发NameError,找不到flatten函数。 - 变量名错误:循环里写的是
list[i],这里的list是Python内置的列表类型,不是传入的参数list1,应该改为list1[i],否则同样会引发NameError。 - 类型判断不够严谨:用
type(item) == list判断是否为列表的方式有局限性,如果遇到继承自list的自定义子类,这个判断会失效。更合适的写法是isinstance(item, list),它能正确识别子类实例。 - 未实现迭代器需求:当前代码直接返回一个扁平化的列表,而题目要求实现迭代器。迭代器需要通过
yield关键字来生成元素,而不是一次性返回所有结果,这样更节省内存,符合迭代器的设计思路。
修正后的代码示例
版本1:返回扁平化列表(修复基础错误)
def flatten(list1): flat_list = [] # 直接遍历列表元素,比range(len())更简洁直观 for item in list1: if isinstance(item, list): flat_list += flatten(item) else: flat_list.append(item) return flat_list
版本2:实现迭代器(符合题目要求)
def flatten_iterator(list1): for item in list1: if isinstance(item, list): # 使用yield from递归迭代子列表的元素 yield from flatten_iterator(item) else: yield item
使用迭代器的测试示例:
nested_list = [1, [4, [6]]] for num in flatten_iterator(nested_list): print(num) # 依次输出:1、4、6
内容的提问来源于stack exchange,提问作者Alvin Teoh
相关产品推荐
相关产品推荐

