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

如何高效优雅地按持有者合并列表中的子列表?

优雅合并同一持有者列表项的高效实现

嘿,这个需求用Python标准库就能轻松搞定,代码简洁又高效!我推荐用collections.defaultdict来做分组合并,逻辑清晰还不用自己处理键不存在的情况,比手动判断字典键要优雅太多。

核心实现代码

from collections import defaultdict

list_all = [[['some_item'],'Robert'] ,[['another_item'],'Robert'],[['itemx'],'Adam'],[['item2','item3'],'Maurice']]

# 用defaultdict按持有者分组收集所有物品
holder_items = defaultdict(list)
for items, holder in list_all:
    holder_items[holder].extend(items)  # 把每个子列表里的物品都扩展进去

# 转换成目标格式
merged_list = [[items, holder] for holder, items in holder_items.items()]

print(merged_list)
# 输出:[[['some_item', 'another_item'], 'Robert'], [['itemx'], 'Adam'], [['item2', 'item3'], 'Maurice']]

为啥这个方案好?

  • 简洁优雅:defaultdict自动处理新持有者的初始化,不用写if holder not in holder_items: holder_items[holder] = []这种冗余代码
  • 高效:遍历一次原列表就完成分组,时间复杂度是O(n)(n是原列表元素个数),比先排序再分组的方法更快,尤其是当列表规模较大时
  • 灵活:如果需要给物品去重,只需要调整一下收集逻辑,比如用dict.fromkeys保留顺序去重:
    # 保留顺序的去重版本
    holder_items = defaultdict(list)
    for items, holder in list_all:
        unique_items = list(dict.fromkeys(items))  # 去重且保留原顺序
        holder_items[holder].extend(unique_items)
    

关于itertools.groupby的补充

如果你不介意先给原列表按持有者排序,也可以用groupby,但要注意**groupby只会把连续的相同键分组**,所以必须先排序:

from itertools import groupby

# 先按持有者排序
sorted_list = sorted(list_all, key=lambda x: x[1])
merged_list = []
for holder, group in groupby(sorted_list, key=lambda x: x[1]):
    # 合并所有物品
    all_items = []
    for items, _ in group:
        all_items.extend(items)
    merged_list.append([all_items, holder])

这个方法适合需要保持分组后顺序和排序后顺序一致的场景,但因为多了排序步骤,时间复杂度变成O(n log n),比defaultdict的O(n)稍慢。

内容的提问来源于stack exchange,提问作者HaR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:30:49