如何解决list assignment index out of range列表索引越界错误
错误原因
你的代码一共有4个问题直接触发报错或者不符合预期:
- 存储数据的空列表
N写在了循环内部,每次循环都会重置为空列表,空列表长度为0,直接访问N[j]会因为索引不存在触发list assignment index out of range - 列表的
append()是原地操作,返回值为None,你写N[j] = N.append(...)属于无效赋值,就算列表长度足够,存进去的也会是空值 df.loc[:,j]是按列名取值,如果你的DataFrame列名不是0起始的连续整数,这里会触发KeyError,按列位置取数需要用iloc- 最后打印语句语法错误,
'list'和变量j之间缺少分隔符,且打印写在循环内的逻辑也不对
正确实现方案
最推荐的写法是把所有列转换后的列表统一存在一个大列表里,按列的顺序索引即可:
# 存储容器放在循环外初始化 col_lists = [] for col in df.columns: # 逐列转成列表后追加到容器,不需要手动维护索引j col_lists.append(df[col].tolist()) # 遍历打印结果 for idx, lst in enumerate(col_lists): print(f'list {idx}', lst)
如果想要更简洁的写法,用列表推导式一行就能完成:
col_lists = [df[col].tolist() for col in df.columns]
如果需要按列名快速找到对应列的列表,可以用字典存储,比单独建一堆零散变量更好维护:
col_dict = {col_name: df[col_name].tolist() for col_name in df.columns} # 调用示例:取列名为"sales"的列列表,直接写col_dict["sales"]即可
原逻辑修正版
如果你要完全沿用你原来按列索引循环的写法,修正后代码如下:
N = [] for j in range(len(df.columns)): # iloc按位置取列,直接append即可,不要给append的返回值赋值 N.append(df.iloc[:, j].tolist()) for j in range(len(N)): print('list', j, N[j])
注意:永远不要在循环内部初始化你需要持久存储数据的容器,否则每次循环都会清空之前存的所有内容。
内容的提问来源于stack exchange,提问作者sahraoui khaoula
相关产品推荐
相关产品推荐

