You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:42:16