Python中如何按特定顺序将一个列表元素插入另一个列表?
如何按指定规则将一个列表元素插入另一个列表?
你的核心需求是把dates的元素依次插入到text的指定位置,形成text元素 + dates元素交替的结构(最后以text的末尾元素收尾)。先说说你原来代码的问题,再给你几个可行的解决方案。
为什么你的嵌套循环会出错?
你写的嵌套循环会遍历text的每个元素,同时每次都把所有dates元素插入一遍,这就导致同一个日期被重复插入多次;再加上插入操作会改变text的长度,索引位置彻底混乱,自然得不到预期结果。
解决方案1:正确的单循环写法
既然我们需要按顺序把每个dates元素插入到text的1,3,5,7位置(每次插入后下一个位置加2),直接遍历dates,维护一个插入位置变量就可以了:
dates = ['21/11/2044', '31/12/2018', '23/9/3000', '25/12/2007'] text = ['What are dates? ', ', is an example.\n', ', is another format as well.\n', ', also exists, but is a bit ludicrous\n', ', are examples but more commonly used'] insert_position = 1 for date in dates: text.insert(insert_position, date) insert_position += 2 # 插入后下一个位置往后挪2位 print(text)
运行这段代码就能得到你想要的预期结果。
解决方案2:无需显式循环的简洁写法
如果你不想写手动维护索引的循环,可以利用zip函数把text的前4个元素和dates配对,再把每一对展开,最后加上text的最后一个元素:
方式A:列表推导式
dates = ['21/11/2044', '31/12/2018', '23/9/3000', '25/12/2007'] text = ['What are dates? ', ', is an example.\n', ', is another format as well.\n', ', also exists, but is a bit ludicrous\n', ', are examples but more commonly used'] # 把每一对(text元素, dates元素)展开,再加上最后一个text元素 result = [item for pair in zip(text[:-1], dates) for item in pair] + [text[-1]] print(result)
方式B:用itertools.chain(更高效)
如果你的列表很大,用itertools.chain可以避免创建中间列表,更节省内存:
from itertools import chain dates = ['21/11/2044', '31/12/2018', '23/9/3000', '25/12/2007'] text = ['What are dates? ', ', is an example.\n', ', is another format as well.\n', ', also exists, but is a bit ludicrous\n', ', are examples but more commonly used'] # 把配对后的元素链起来,再加上最后一个text元素 result = list(chain.from_iterable(zip(text[:-1], dates))) + [text[-1]] print(result)
回答你的疑问
- 是否必须使用for循环?不是,上面的列表推导式和
itertools方法都不需要写显式的for循环(底层还是迭代,但代码更简洁易读)。 - 是否需要枚举dates所有元素?是的,因为每个
dates元素都要插入到对应位置,必须逐个处理,但可以用更优雅的方式处理,而非嵌套循环。
内容的提问来源于stack exchange,提问作者Alden Tan
相关产品推荐
相关产品推荐

