Python类存储的嵌套列表如何正确合并为目标一维列表
问题解决方法
方案1:从类方法源头修改,彻底避免嵌套结构
原来的add_duty方法使用append,会把每次传入的整组职责列表作为单个元素塞进self.duty,自然产生多层嵌套。只要把append换成extend即可,extend的作用是将传入可迭代对象的每一个元素逐个追加到列表尾部,完全匹配你的需求:
def add_duty(self, new_duty): self.duty.extend(new_duty)
修改后按原逻辑调用3次方法,self.duty会直接生成一维列表['Do sth', 'Shine', 'Swag', 'Lag'],无需后续额外合并。
方案2:若需保留嵌套存储结构,正确展平为一维列表
如果业务场景需要保留按批次分组存储的嵌套结构,仅在输出时展平列表,需要规避之前逐字符拆分的错误逻辑。
错误结果的根因
你之前写的合并逻辑多嵌套了一层遍历,将本应直接追加的字符串类型职责文本,用extend方法迭代拆解(extend会逐个取出可迭代对象的元素追加,对字符串使用时就会拆成单个字符),这是导致逐字符拆分错误结果的核心原因。
你之前的错误写法大致如下:
flat_duty = [] for duty_group in self.duty: for single_duty_str in duty_group: # 对字符串执行extend,会把字符串拆成单个字符逐个加入列表 flat_duty.extend(single_duty_str)
正确的展平写法
- 基础循环写法(最易理解,无额外依赖):
# 此时self.duty为嵌套结构 [['Do sth', 'Shine'], ['Swag'], ['Lag']] flat_duty = [] for duty_group in self.duty: # 直接将内层分组列表的全部元素追加到新列表,不对字符串做额外迭代 flat_duty.extend(duty_group)
执行后flat_duty即可得到预期的一维列表结果。
- 内置库简洁写法:
from itertools import chain flat_duty = list(chain.from_iterable(self.duty))
注意:本方法仅适配固定两层嵌套的结构,若嵌套层级更深需要做递归判断类型再展平。
内容的提问来源于stack exchange,提问作者Tuscanpy
相关产品推荐
相关产品推荐

