Python实现列表相邻同属性元素分组:'a'元组两两分组,'b'单独保留
嘿,这个分组需求其实不用拆分两个列表再合并,一次遍历就能搞定,既简洁又高效,还能完美保留原列表的顺序!
我来给你捋捋思路:我们只需要维护一个临时的小分组,遍历原列表的时候逐个处理元素:
- 遇到属性为'a'的元组,就把它加入临时分组;如果临时分组里已经有两个'a'了,就把这个完整的组加入结果,然后清空临时分组准备下一组。
- 遇到属性为'b'的元组,先看看临时分组里有没有没配对的单个'a'(比如前一个元素是'a'但还没凑够两个),有的话先把这个单个'a'组加入结果,再把当前的'b'单独作为一组加入结果,最后清空临时分组。
- 遍历结束后,别忘了检查临时分组里有没有剩下的单个'a',有的话也要加入结果哦。
直接上代码,注释写得很清楚:
A = [(721,'a'),(765,'a'),(421,'a'),(422,'a'),(106,'b'),(784,'a'),(201,'a'),(206,'b'),(207,'b')] result = [] current_group = [] for item in A: if item[1] == 'a': current_group.append(item) # 凑够两个a就加入结果,清空临时组 if len(current_group) == 2: result.append(current_group.copy()) current_group.clear() else: # 先处理临时组里可能剩下的单个a if current_group: result.append(current_group) current_group.clear() # b单独成组 result.append([item]) # 处理遍历结束后剩下的单个a if current_group: result.append(current_group) print(result)
运行这个代码就能得到你想要的结果:[[(721, 'a'), (765, 'a')], [(421, 'a'), (422, 'a')], [(106, 'b')], [(784, 'a'), (201, 'a')], [(206, 'b')], [(207, 'b')]]
这个方案的好处在于:
- 时间复杂度是O(n),只需要遍历一次原列表,比拆分再合并的方式少了一次合并操作;
- 空间开销极小,除了存储结果的列表,临时分组最多只存1个元素;
- 完全保留了原列表的元素顺序,不会因为拆分a和b而打乱原有结构;
- 还能处理边界情况,比如列表最后一个元素是单个'a'的情况,不会遗漏。
对比你之前拆分a和b的思路,这个方法逻辑更连贯,不需要额外记录元素的位置信息,代码也更易读维护~
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

