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

Python中如何将等长列表的子列表结构复制到另一列表?

更Pythonic的列表同步分组实现

好问题!要让第一个列表和itertools.groupby处理后的第二个列表拥有完全相同的子列表结构,我们可以利用itertools里的工具组合来实现,既简洁又高效。

先举个具体的例子让场景更清晰:假设我们有动物名称列表和对应的“是否为家养宠物”标记列表,后者已经用groupby完成了分组:

import itertools

animals = ["cat", "dog", "eagle", "wolf", "parrot", "hamster"]
is_pet = [True, True, False, False, True, True]

# 用groupby对是否家养进行分组
pet_groups = itertools.groupby(is_pet)

核心思路

groupby返回的每个分组对象,本质是原迭代器中连续相同元素的迭代器。我们可以通过获取每个分组的长度,对第一个列表的迭代器进行“切片”,从而得到对应结构的子列表。

简洁实现方式

我们可以用itertools.tee复制第一个列表的迭代器(避免原迭代器被一次性消耗),再配合itertools.islice按分组长度提取元素:

# 复制animals的迭代器,保证后续可以多次读取
animals_iter, animals_copy = itertools.tee(animals)

# 同步生成对应结构的子列表
grouped_animals = []
for _, group in pet_groups:
    # 获取当前分组的元素数量
    group_size = len(list(group))
    # 从复制的迭代器中取出对应数量的元素
    grouped_animals.append(list(itertools.islice(animals_copy, group_size)))

print(grouped_animals)
# 输出: [['cat', 'dog'], ['eagle', 'wolf'], ['parrot', 'hamster']]

如果追求更紧凑的写法,还可以用列表推导式一行搞定:

animals_iter = iter(animals)
grouped_animals = [list(itertools.islice(animals_iter, len(list(group)))) for _, group in pet_groups]

注意事项

  • itertools.groupby仅对连续相同的元素分组,如果你的标记列表(第二个列表)不是连续分组的,需要先对两个列表按标记排序再分组,否则结果会不符合预期。
  • 用迭代器处理的好处是惰性计算,当列表非常大时,比先把所有分组转成列表再处理更节省内存。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:28:48