如何基于Python中列表l2的分值规则对列表l1有序分组?
Python列表按规则分组问题
给定两个Python列表:
l1 = ['a','b','c','d','e','f','g','h'] l2 = [True, True, True, False, False, True, False, True]
需要按顺序遍历元素,依据以下规则对l1进行分组,最终得到结果:groups = [['a','b','c'],['d','e'],['f','g','h']]
- 每个
True对应元素计1分,每个False对应元素计2分; - 每组的总分不能超过4分;
- 必须严格按照列表原有顺序分组。
你尝试的代码
l1 = ["a","b","c","d","e","f","g","h"] l2 = [True, True, True, False, False, True, False, True] groups = [] count = 1 index = 0 while index <= len(l1): group = [] for e,b in zip(l1,l2): if len(group) <= 3: if b is True: group.append(e) index += 1 else: group.append(e) group.append("False") index += 1 else: groups.append(group) group = [] index -= 1
代码问题分析
这段代码存在几个核心问题:
- 逻辑混乱:嵌套
while和for循环导致遍历逻辑重复,index的增减处理错误,容易引发死循环或者元素遗漏; - 规则误解:错误地给
False对应的元素额外添加了字符串"False",完全不符合分组规则; - 判断依据错误:用组的长度(
len(group) <=3)代替分数判断,和题目要求的“总分不超过4分”规则不符。
正确解法代码
l1 = ['a','b','c','d','e','f','g','h'] l2 = [True, True, True, False, False, True, False, True] groups = [] current_group = [] current_score = 0 for elem, flag in zip(l1, l2): # 计算当前元素对应的分数 score = 1 if flag else 2 # 检查加入当前组后总分是否超标 if current_score + score <= 4: current_group.append(elem) current_score += score else: # 当前组已达上限,存入结果列表,新建组存入当前元素 groups.append(current_group) current_group = [elem] current_score = score # 遍历结束后,把最后一个未存入的组加入结果 if current_group: groups.append(current_group) print(groups) # 输出结果:[['a', 'b', 'c'], ['d', 'e'], ['f', 'g', 'h']]
解法逻辑说明
- 维护两个变量:
current_group存储当前正在构建的组,current_score记录当前组的总分; - 逐个遍历
l1和l2的对应元素,计算当前元素的分数; - 如果当前元素加入后总分不超过4分,就将其加入当前组并更新总分;
- 如果加入后总分超标,就把当前组存入结果列表,然后新建一个组存入当前元素,重置总分;
- 遍历结束后,记得把最后一个未存入的组加入结果列表(避免遗漏最后一组)。
内容的提问来源于stack exchange,提问作者John Provost
相关产品推荐
相关产品推荐

