基于条件将元组合并为字典,寻求更Pythonic的实现方式
更Pythonic的元组分组实现方案
需求说明
将给定的元组集合按元组的第二个元素分组,同时将每个元组转换为「位置序号(从1开始)、原第二个元素、序号×10」的格式,最终生成指定结构的字典。
输入示例
x = ( (1,"A", 10),(1,"B", 10),(1,"B", 10),(1,"C", 10),(1,"C", 10),(1,"B", 10),(1,"A", 10),(1,"A", 10),(1,"C", 10),(1,"B", 10))
预期输出
{'A': [(1, 'A', 10), (7, 'A', 70), (8, 'A', 80)], 'B': [(2, 'B', 20), (3, 'B', 30), (6, 'B', 60), (10, 'B', 100)], 'C': [(4, 'C', 40), (5, 'C', 50), (9, 'C', 90)]}
已实现的基础代码
def consolidate(values): res = {} for a in values: if a[1] in res: p = res[a[1]] p.append(a) res[a[1]] = p else: res[a[1]] = [a] return res
更Pythonic的实现方案
方案一:使用collections.defaultdict
借助标准库的defaultdict省去手动判断键是否存在的逻辑,代码更简洁:
from collections import defaultdict def consolidate(values): grouped = defaultdict(list) # 遍历元素并获取从1开始的位置序号 for idx, item in enumerate(values, start=1): key = item[1] # 生成预期格式的新元组 new_tuple = (idx, key, idx * 10) grouped[key].append(new_tuple) # 转换为普通字典返回 return dict(grouped)
方案二:使用字典的setdefault方法
如果不想引入额外模块,用原生字典的setdefault方法也能简化逻辑:
def consolidate(values): grouped = {} for idx, item in enumerate(values, start=1): key = item[1] new_tuple = (idx, key, idx * 10) # 不存在键则创建空列表,直接追加元素 grouped.setdefault(key, []).append(new_tuple) return grouped
说明
这两种实现都遵循了Python的简洁风格,同时完成了元组内容转换和按指定键分组的完整需求,比原代码更易读、更简洁。
内容的提问来源于stack exchange,提问作者Pankaj Singh
相关产品推荐
相关产品推荐

