循环中如何向嵌套多列表添加元素?遇KeyError问题求助
解决嵌套列表转置的KeyError问题
看起来你是想对二维列表做转置操作——把每个子列表相同位置的元素归类到同一个输出列表里对吧?遇到KeyError大概率是因为你用来存储结果的容器(比如普通字典)没有预先创建对应的键,或者用列表时索引超出了已初始化的范围。我给你几种实用的解决思路:
方案1:用zip快速实现(最简洁,适合子列表长度一致的场景)
如果你的所有子列表长度都相同,直接用Python内置的zip函数就能搞定,这是最优雅的方式:
# 示例输入:9个嵌套在父列表里的子列表(这里用3个举例) input_lists = [[1,2,3], [3,2,1], [5,6,7]] # zip(*input_lists)会把每个子列表的对应位置元素打包成元组 output_tuples = list(zip(*input_lists)) # 如果需要列表而不是元组,再转一层 output_lists = [list(group) for group in output_tuples] print(output_lists) # 输出:[[1, 3, 5], [2, 2, 6], [3, 1, 7]]
方案2:预先初始化输出列表(适合子列表长度不一致的场景)
如果你的子列表长度可能不一样,先初始化足够数量的空列表,再逐个填充元素,就能避免索引越界或KeyError:
input_lists = [[1,2,3], [3,2], [5,6,7,8]] # 先找到最长的子列表长度,确定需要多少个输出列表 max_sublist_len = max(len(sublist) for sublist in input_lists) # 初始化对应数量的空列表 output = [[] for _ in range(max_sublist_len)] # 遍历每个子列表,把元素放到对应位置的输出列表里 for sublist in input_lists: for idx, item in enumerate(sublist): output[idx].append(item) print(output) # 输出:[[1, 3, 5], [2, 2, 6], [3, 7], [8]]
方案3:用defaultdict避免KeyError(字典方式的兼容方案)
如果你原本是用字典来存储结果,改用collections.defaultdict就能自动创建不存在的键对应的空列表,从根源解决KeyError:
from collections import defaultdict input_lists = [[1,2,3], [3,2,1]] # 初始化一个默认值为空列表的字典 output_dict = defaultdict(list) for sublist in input_lists: for idx, item in enumerate(sublist): output_dict[idx].append(item) # 把字典转成有序的列表(按索引排序) output = [output_dict[i] for i in sorted(output_dict.keys())] print(output) # 输出:[[1, 3], [2, 2], [3, 1]]
为什么你原来的代码会出KeyError?
举个例子,如果你写了类似这样的代码:
input_lists = [[1,2,3], [3,2,1]] output = {} for sublist in input_lists: for idx, item in enumerate(sublist): output[idx].append(item) # 这里会报错!
第一次循环时idx=0,但output字典里根本没有0这个键,Python找不到对应的键就会抛出KeyError。上面的方案要么预先创建了容器(列表/带默认值的字典),要么用zip直接帮你处理了分组,自然就不会有这个问题啦。
内容的提问来源于stack exchange,提问作者AuctortiA
相关产品推荐
相关产品推荐

