如何在Python中按列表首个元素的值合并列表元素
按邮箱自动分组数据的实现方法
原始数据说明
你给出的原始数据使用了集合({}),但集合是无序且不保证元素顺序的,更适合用元组列表存储这类有序关联数据,修正后的数据结构如下:
original_data = [ ('sam@yahoo.com', 7007, '1'), ('sam@yahoo.com', 8471, '2'), ('john@yahoo.com', 16113, '2') # 更多数据... ]
需求实现
要按邮箱自动分组,无需指定具体邮箱名称,以下是标准实现方案:
步骤1:用字典完成核心分组
利用字典的键存储邮箱,值存储该邮箱对应的所有关联详情列表,实现自动分组:
grouped_dict = {} for item in original_data: email = item[0] # 提取邮箱外的其他字段作为详情 details = list(item[1:]) if email in grouped_dict: # 邮箱已存在,追加新详情 grouped_dict[email].append(details) else: # 邮箱首次出现,初始化详情列表 grouped_dict[email] = [details]
执行后grouped_dict的结果为:
{ 'sam@yahoo.com': [[7007, '1'], [8471, '2']], 'john@yahoo.com': [[16113, '2']] }
步骤2:转换为目标列表格式
如果需要转换成包含单个邮箱字典的列表,可通过列表推导式快速实现:
result_list = [{email: details} for email, details in grouped_dict.items()]
最终得到的result_list为:
[ {'sam@yahoo.com': [[7007, '1'], [8471, '2']]}, {'john@yahoo.com': [[16113, '2']]} ]
补充说明
你提到的“对比下一个元素”的思路效率较低,用字典分组是更简洁高效的方案,时间复杂度为O(n),无需手动遍历对比元素。
内容的提问来源于stack exchange,提问作者Nikolay Debolsky
相关产品推荐
相关产品推荐

