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
相关产品推荐
相关产品推荐

