Python中如何将含字典的列表数据存入字典?代码报错求解
问题解答
一、修复你的代码(解决索引越界错误)
你的代码出现索引越界和逻辑错误的核心原因有两个:
- 空列表直接赋值索引:
template初始化后是空列表,你用template[i] = ...试图给不存在的索引位置赋值,必然触发IndexError。 - 字符串当作列表索引使用:
element[subsequence] = list(template[i])[subsequence]中,subsequence是字符串类型的STR名称,而列表索引只能是整数,这会导致类型错误。
修改后的代码如下:
# TODO: Check database for matching profile template = [] element = {} for i in range(len(LI)): # 用append向空列表添加元素,避免索引越界 template.append(list(LI[i].values())[1:]) # 通过zip将STR名称(sub)和对应数值(template[i])配对,直接构建字典 current_person_data = dict(zip(sub, template[i])) # 按需处理当前人员数据:比如存入列表或直接用于对比 # 示例:若要保存所有人的数据,可改用列表存储 # element.append(current_person_data) element = current_person_data
修改说明:
- 用
template.append(...)替代索引赋值,确保每次将新元素添加到列表末尾,彻底避免索引越界问题。 - 用
zip(sub, template[i])将STR名称与对应数值一一配对,直接转换为字典,既避免了索引错误,又简化了字典构建逻辑。
二、关于视频中写法的效率分析
视频中的写法是当前场景下的最优实现之一,理由如下:
- 可读性极强:直接遍历
LI中的每个person字典(csv.DictReader返回的每一行都是字典),用person[subsequence]直接访问对应STR的数值,逻辑直观,新手也能快速理解。 - 效率更优:避免了
list(LI[i].values())[1:]这种不必要的列表转换操作,直接操作原字典对象,减少了内存开销和类型转换的时间成本。 - 符合Python惯用风格:这种写法是典型的Pythonic代码,简洁优雅,出错概率远低于手动处理索引和列表转换的写法。
从时间复杂度来看,两种写法都是O(N*M)(N是数据库人数,M是STR数量),但视频中的写法常数项更小,实际运行效率更高。
内容的提问来源于stack exchange,提问作者unleash_bear
相关产品推荐
相关产品推荐

