使用itertools.product未获预期排列结果,求问题排查
问题分析与解决方法
嘿,我完全get到你的困惑啦!你之所以得到不符合预期的结果,核心原因是用错了工具——itertools.product本来就是用来生成所有元素的笛卡尔积的,而你需要的是两个列表对应位置元素的配对,这时候应该用Python内置的zip()函数。
为什么itertools.product不对?
itertools.product(a, b)的作用是把a里的每一个元素和b里的每一个元素都组合一遍,生成所有可能的二元组。比如你把list3Append(4个元素)和list6Append(4个元素)传给它,它会生成4×4=16个组合,这显然不是你要的对应位置配对。
正确的做法:用zip()
zip()函数会遍历多个可迭代对象,每次从每个对象里取出对应位置的元素,把它们打包成一个元组。正好匹配你想要的“对应位置元素组合”的需求。
代码示例:
import itertools # 先生成你已经得到的list3Append和list6Append list1 = ('In1', 'In2') list2 = ('Ta1', 'Ta2') list3Append = list(itertools.product(list1, list2)) list4 = [[1,2,3], [4,5,6]] list5 = [[7,8,9], [10,11,12]] list6Append = list(itertools.product(list4, list5)) # 用zip()得到对应位置的配对 list7 = list(zip(list3Append, list6Append)) # 输出结果 for item in list7: print(f"list7: {item}")
输出结果:
list7: (('In1', 'Ta1'), ([1, 2, 3], [7, 8, 9])) list7: (('In1', 'Ta2'), ([1, 2, 3], [10, 11, 12])) list7: (('In2', 'Ta1'), ([4, 5, 6], [7, 8, 9])) list7: (('In2', 'Ta2'), ([4, 5, 6], [10, 11, 12]))
额外补充
如果你的两个列表长度不一致,zip()会以较短的列表为准截断结果。如果想要保留所有元素(长度不足的用None填充),可以用itertools.zip_longest(),不过你的场景里两个列表长度相同,用zip()就足够啦。
内容的提问来源于stack exchange,提问作者nasil122002
相关产品推荐
相关产品推荐

