在列表每30个索引位置插入None值 解决CSV数据插入空行提前终止问题
问题原因和修复方案
问题原因
代码失效的核心原因是range序列在循环开始前就已经基于列表初始长度生成完毕,而循环过程中不断调用insert往列表里添加元素,列表实际长度持续变大,后续需要插入的索引位置会超出预先生成的range的最大索引值,因此插入操作执行到一半就会停止。
以291593行数据为例,初始len(l)=291593,生成的range是range(30, 291593+30, 31),最大索引是291623,但每插入1个元素列表长度就加1,插入8000多次后,需要插入的位置就已经超过291623,后续的插入自然不会执行。
修复方案
推荐两种可直接落地的修复方式,按需选择:
方案1:倒序插入(代码修改量最小)
从列表尾部往头部计算插入点,插入操作不会影响尚未处理的前面的插入位置索引:
list1=[df['Date'].tolist(),df['ticker'].tolist(), df['cf'].tolist()] n=30 for l in list1: # 从最后一个插入点往前倒序插入 for i in range(len(l) // n * n, n-1, -n): l.insert(i, None)
方案2:生成新列表(效率更高,适合大数据量)
列表的insert操作是O(n)复杂度,29万行数据频繁插入性能很差,直接生成新列表速度快很多:
list1=[df['Date'].tolist(),df['ticker'].tolist(), df['cf'].tolist()] n=30 new_list1 = [] for l in list1: new_l = [] for idx, item in enumerate(l, 1): new_l.append(item) if idx % n == 0: new_l.append(None) new_list1.append(new_l) # 如果需要替换原list1的内容可新增一行:list1 = new_list1
内容的提问来源于stack exchange,提问作者Camilla
相关产品推荐
相关产品推荐

