如何将嵌套列表以指定分隔符分隔拼接,模拟string.join()的行为?
实现嵌套列表的类似
str.join()功能 我懂你想要的效果——就像字符串的join()方法那样,把分隔符插入到嵌套列表的每两个子列表之间,而不是先扁平化列表再插入元素。你之前用itertools.chain的思路依赖于子列表长度一致,显然没法处理子列表长度参差不齐的情况,下面给你几个适配性更强的解决方案:
方法一:简洁的列表推导式+itertools.chain
核心思路是给每个子列表后面都配上分隔符,最后再去掉末尾多余的那个分隔符,用chain把结构展开:
from itertools import chain lsts = [[1, 2, 3], [4, 5], [6]] delim = ['delim'] # 遍历子列表,每个子列表后跟分隔符,最后切掉末尾多余的分隔符 result = list(chain(*([sub, delim] for sub in lsts)))[:-1] print(result) # 输出: [[1, 2, 3], ['delim'], [4, 5], ['delim'], [6]]
这个写法很紧凑,完全贴合字符串join()的逻辑:每个元素后加分隔符,再移除最后一个多余的分隔符。
方法二:手动循环构建(直观易读)
如果不想依赖itertools,手动循环的方式更适合新手理解,逻辑一目了然:
lsts = [[1, 2, 3], [4, 5], [6]] delim = ['delim'] result = [] for idx, sub_list in enumerate(lsts): result.append(sub_list) # 只有非最后一个子列表,才添加分隔符 if idx != len(lsts) - 1: result.append(delim) print(result) # 输出同样符合预期
这种写法可以轻松应对各种边界情况,比如空列表、只有一个子列表的场景,不会出现多余的分隔符。
方法三:用zip_longest处理更复杂场景
如果需要处理空列表等极端情况,itertools.zip_longest会更健壮:
from itertools import chain, zip_longest lsts = [[1, 2, 3], [4, 5], [6]] delim = ['delim'] # 生成和子列表数量-1一致的分隔符列表 delim_list = [delim] * (len(lsts) - 1) # 配对子列表和分隔符,展开后过滤掉末尾的None result = list(chain.from_iterable(zip_longest(lsts, delim_list)))[:-1] print(result)
要是你的分隔符是可变对象(比如需要每个分隔符都是独立的新列表),记得把delim换成生成新对象的方式,比如用lambda: ['delim']()来创建新实例。
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

