如何以Pythonic方式合并相同Main ID的字典Sub IDs列表?是否可使用列表推导式?
合并相同Main ID的Sub IDs列表的Pythonic实现方式
针对你的需求,这里有几种简洁的Python实现方式,同时聊聊能不能用列表推导式来完成:
方法一:字典聚合(最直观高效的Pythonic方式)
这种方法用普通字典来跟踪每个Main ID对应的Sub IDs,逻辑清晰,时间复杂度是O(n),不需要额外排序,适合大多数场景:
original_list = [{'Main ID': 0, 'Sub IDs': [0]}, {'Main ID': 0, 'Sub IDs': [3]}, {'Main ID': 2, 'Sub IDs': [3]}] aggregated = {} for item in original_list: main_id = item['Main ID'] # 如果当前Main ID还没被记录,初始化一个新条目 if main_id not in aggregated: aggregated[main_id] = {'Main ID': main_id, 'Sub IDs': []} # 扩展Sub IDs列表 aggregated[main_id]['Sub IDs'].extend(item['Sub IDs']) # 将字典的值转换为最终列表 result = list(aggregated.values()) print(result) # 输出: [{'Main ID': 0, 'Sub IDs': [0, 3]}, {'Main ID': 2, 'Sub IDs': [3]}]
方法二:结合itertools.groupby和列表推导式
如果你想使用列表推导式,可以借助itertools.groupby,但要注意**groupby要求列表先按分组键排序**,否则会把不连续的相同Main ID当成独立分组:
from itertools import groupby from operator import itemgetter original_list = [{'Main ID': 0, 'Sub IDs': [0]}, {'Main ID': 0, 'Sub IDs': [3]}, {'Main ID': 2, 'Sub IDs': [3]}] # 先按Main ID排序,确保相同ID的项连续 sorted_list = sorted(original_list, key=itemgetter('Main ID')) # 用列表推导式完成分组和合并 result = [ {'Main ID': main_id, 'Sub IDs': [sub_id for item in group for sub_id in item['Sub IDs']]} for main_id, group in groupby(sorted_list, key=itemgetter('Main ID')) ] print(result) # 输出符合需求的结果
关于纯列表推导式的可行性
纯列表推导式(不借助字典、groupby这类工具)几乎无法完成这个需求,因为列表推导式是无状态的——它没办法跟踪已经处理过哪些Main ID,也就没法合并重复项。所以必须结合状态存储工具(比如字典)或者分组工具(比如groupby)才能实现。
内容的提问来源于stack exchange,提问作者user3206440
相关产品推荐
相关产品推荐

