You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现多列表交替合并,且最后一个列表每次取两个元素?

问题描述

给定四个列表:

a = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8"]
b = ["b1", "b2", "b3", "b4", "b5", "b6"]
c = ["c1", "c2", "c3", "c4", "c5"]
d = ["d1", "d2", "d3", "d4", "d5", "d6", "d7"]

需要生成一个新列表,规则如下:

  • 按顺序逐个交替取前三个列表(a、b、c)的元素,直到无法继续
  • 最后一个列表d每次取两个元素,直到无法取

最终目标结果为:

new_list = ["a1", "b1", "c1", "d1", "d2", "a2", "b2", "c2", "d3", "d4", "a3", "b3", 
            "c3", "d5", "d6", "a4", "b4", "c4", "d7", "a5", "b5", "c5", "a6", "b6", 
            "a7", "a8"]

已知可以用itertools实现交替合并,现有代码如下:

import itertools
book_list = [x for x in itertools.chain.from_iterable(itertools.zip_longest(a,b, c, d)) if x is not None]

但无法保证d每次取两个元素,请问如何实现?能否用pairwise()来解决?


解决方案

可以先把列表d处理成无重叠的两两分组迭代器,再结合itertools.zip_longest和链式展开来实现需求,具体步骤如下:

1. 实现分组函数

先写一个工具函数,把输入的可迭代对象分成指定大小的块,最后一块不足指定大小也会保留:

import itertools

def chunked(iterable, chunk_size):
    it = iter(iterable)
    while True:
        chunk = tuple(itertools.islice(it, chunk_size))
        if not chunk:
            break
        yield chunk

2. 合并并生成目标列表

将d用上面的函数处理成两两一组的迭代器,再和a、b、c一起用zip_longest交替合并,最后展开所有元素并过滤空值:

a = ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8"]
b = ["b1", "b2", "b3", "b4", "b5", "b6"]
c = ["c1", "c2", "c3", "c4", "c5"]
d = ["d1", "d2", "d3", "d4", "d5", "d6", "d7"]

# 把d处理成两两一组的迭代器
d_chunked = chunked(d, 2)

new_list = []
# 交替遍历a、b、c和分组后的d
for items in itertools.zip_longest(a, b, c, d_chunked):
    for item in items:
        if item is not None:
            # 如果是d的分组元组,就逐个添加元素
            if isinstance(item, tuple):
                new_list.extend(item)
            else:
                new_list.append(item)

# 验证结果
print(new_list == ["a1", "b1", "c1", "d1", "d2", "a2", "b2", "c2", "d3", "d4", "a3", "b3", 
                   "c3", "d5", "d6", "a4", "b4", "c4", "d7", "a5", "b5", "c5", "a6", "b6", 
                   "a7", "a8"])  # 输出True

关于pairwise()的说明

itertools.pairwise()的作用是生成相邻重叠的元素对(比如对d会生成("d1","d2"), ("d2","d3"), ("d3","d4")...),这会导致元素重复,不符合需求。因此不适合用它来实现d的无重叠两两分组,上面的chunked函数更合适。


内容的提问来源于stack exchange,提问作者Giacomo F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 04:40:23