如何依据列表中的列表名称批量对对应列表执行zip操作?
问题描述
现有以下列表:
Factor1 = [1,2,3,4] Factor2 = [5,6,7,8] Factor3 = [9,10,11,12]
以及存储待zip列表名称的组合列表:
Combination = [['Factor1','Factor2'], ['Factor3','Factor1']]
需要参照Combination列表,将对应Factor*列表的元素通过zip组合,得到如下结果:
Combination1 = [(1,5),(2,6),(3,7),(4,8)] Combination2 = [(9,1),(10,2),(11,3),(12,4)]
实际场景中Combination列表包含上千组组合,需迭代完成上述过程。已知单组操作代码为:
Combination1 = list(zip(Factor1,Factor2))
但不清楚如何将Combination列表中的元素作为zip的输入参数。
解决方案
核心思路是通过变量名字符串获取对应的列表对象,再用解包操作将列表作为zip的参数传入,具体实现代码如下:
Factor1 = [1,2,3,4] Factor2 = [5,6,7,8] Factor3 = [9,10,11,12] Combination = [['Factor1','Factor2'], ['Factor3','Factor1']] # 初始化结果存储容器 result_list = [] # 迭代处理每组组合 for group in Combination: # 根据字符串变量名获取实际列表对象(全局作用域用globals,局部用locals) target_lists = [globals()[var_name] for var_name in group] # 解包列表作为zip参数,转成列表后存入结果 result_list.append(list(zip(*target_lists))) # 提取结果(按需命名) Combination1 = result_list[0] Combination2 = result_list[1] # 验证输出 print(Combination1) # 输出: [(1, 5), (2, 6), (3, 7), (4, 8)] print(Combination2) # 输出: [(9, 1), (10, 2), (11, 3), (12, 4)]
关键细节说明:
- 变量名转对象:
globals()[var_name]可以通过字符串形式的变量名,获取全局作用域中对应的列表对象;如果列表定义在局部作用域(比如函数内部),则替换为locals()[var_name]。 - 解包操作:
zip(*target_lists)中的*会把target_lists里的每个列表作为zip的独立参数,效果和手动写zip(Factor1, Factor2)完全一致,完美适配多组变量的迭代场景。 - 批量存储:用
result_list统一存储所有组合结果,后续可以通过索引直接调用,也可以用字典映射命名(比如{f"Combination{i+1}": res for i, res in enumerate(result_list)}),方便大量组合的管理。
内容的提问来源于stack exchange,提问作者Abdul Mateen Hashim
相关产品推荐
相关产品推荐

