如何解决Python列表分块后最后子列表残留单个元素的问题
修复剩余元素无法全部分配的问题
问题背景
要把长度为29的列表OList按指定的DivideLen=12分割成多个子列表,要求最后一个子列表元素数量不足DivideLen时,把它的元素分配到前面的子列表里,再删掉这个最后子列表。但当前代码执行后,最后子列表还剩1个元素没分配完。
原代码
# Length of OList is 29 DivideLen = 12 OList = [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "AA", "AB", "AC", ] # Divide OList to multiple small list of length 12 DividedList = [OList[i:i + DivideLen] for i in range(0, len(OList), DivideLen)] LastIndex = len(DividedList) - 1 LastList = DividedList[LastIndex] if len(DividedList) > 1 and len(LastList) < DivideLen: # Run a Loop from Zero to Less then the Index of Last List of DividedList for i in range(0, LastIndex): for elem in LastList: print(f"Length of List {i} Before: {len(DividedList[i])}") print(f"Length of Last List Before: {len(DividedList[LastIndex])}") DividedList[i].append(elem) DividedList[LastIndex].remove(elem) print(f"Length of List {i} After: {len(DividedList[i])}") print(f"Length of Last List After: {len(DividedList[LastIndex])}")
当前结果
DividedList =[ [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "Y", "Z", "AA", ], [ "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "AB" ], [ "AC" ] ]
预期结果
DividedList =[ [ "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "Y", "Z", "AA", ], [ "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "AB", "AC" ] ]
问题原因
原循环逻辑错误:外层遍历前序子列表,内层遍历剩余元素时,第一个前序子列表会先把剩余元素逐个加完,等轮到第二个前序子列表时,剩余元素已经被改得只剩2个,加完后还剩1个。这种嵌套循环的方式根本不是均匀分配,而是把剩余元素一股脑先塞给第一个子列表,再塞给第二个,逻辑完全不符合需求。
修复方案
换一种分配逻辑:轮流把剩余元素分配给前序的每个子列表,直到剩余元素为空,最后删掉空的最后子列表。
修改后的代码片段(替换原有的if块内容):
if len(DividedList) > 1 and len(LastList) < DivideLen: # 循环分配剩余元素,直到最后子列表为空 while len(LastList) > 0: # 轮流给每个前序子列表加元素 for i in range(LastIndex): if not LastList: break elem = LastList.pop(0) DividedList[i].append(elem) # 删除空的最后子列表 del DividedList[LastIndex]
验证结果
执行修改后的代码,DividedList会和预期结果完全一致:前两个子列表分别分配到3个和2个剩余元素,最后子列表被删除。
内容的提问来源于stack exchange,提问作者Aly
相关产品推荐
相关产品推荐

