如何修改itertools代码,实现可变长度字典列表的指定元组输出?
问题描述
输入示例:
vv = [{'values': ['AirportEnclosed', 'Bus', 'MotorwayServiceStation']},{'values': ['All']}]
输入是可变数量的字典组成的列表,所有字典都包含values键,对应的值可以是字符串或列表。期望生成所有可能的元组组合,输出格式如下:
( ('AirportEnclosed', 'All'), ('Bus', 'All'), ('MotorwayServiceStation', 'All') )
当前使用的itertools代码:
import itertools outputList=[] for i,g in itertools.groupby(vv, key=operator.itemgetter("values")): outputList.append(list(g)) print(outputList)
得到的错误输出:
[[{'values': ['AirportEnclosed', 'Bus', 'MotorwayServiceStation']}], [{'values': ['All']}]]
需要修改哪些内容才能实现期望的输出?
解决方案
你选的工具不对——itertools.groupby是用来做分组的,完全满足不了生成元素组合的需求。你要实现的是多组元素的笛卡尔积,应该用itertools.product。具体修改步骤和代码如下:
- 先把每个字典里
values的值统一处理成列表格式(因为值可能是单个字符串,也可能是列表) - 用
itertools.product计算这些列表的笛卡尔积 - 把最终结果转换成你要的元组格式
正确代码:
import itertools # 提取每个字典的values,统一转成列表 value_groups = [] for d in vv: val = d['values'] # 单个字符串转成列表,列表直接保留 value_groups.append(val if isinstance(val, list) else [val]) # 计算笛卡尔积并转为元组 final_result = tuple(itertools.product(*value_groups)) print(final_result)
运行后输出和你期望的一致:
(('AirportEnclosed', 'All'), ('Bus', 'All'), ('MotorwayServiceStation', 'All'))
说明
- 统一转成列表是为了兼容
values值为单个字符串的情况,比如如果有个字典是{'values': 'Subway'},转成['Subway']后才能和其他组正常生成组合 itertools.product(*value_groups)的作用就是把多个列表里的元素两两(或多个)组合,生成所有可能的元组- 最后用
tuple()把结果包装成你要的元组格式,而不是列表
内容的提问来源于stack exchange,提问作者gdogg371
相关产品推荐
相关产品推荐

