Python:不使用itertools生成两个数组的所有组合(代码问题排查)
问题原因
你代码里的核心问题是列表的赋值是引用传递:当你写e = d时,并没有创建一个新的列表,只是让变量e和d指向同一个列表对象。所以每次循环执行e.append(b[z]),其实都是在修改同一个d列表,最后f里的所有元素都是这个d的引用,而且d被两次append元素,就变成了带两个b中元素的长列表,导致输出重复且不符合预期。
修复方案
方案1:修改现有代码,复制列表副本
只需要把e = d改成创建d的副本,比如用d.copy()或者切片d[:],这样每次循环都生成一个新的列表,再添加b中的元素:
b = [11, 14] c = [[1,2,3],[2,3,4],[3,4,5],[4,5,6]] f = [] for x in range(0, len(c)): d = [] for y in range(0, len(c[0])): d.append(c[x][y]) for z in range(0, len(b)): e = d.copy() # 或者 e = d[:],创建新列表副本 e.append(b[z]) f.append(e) print(f)
方案2:更Pythonic的写法(简化循环)
不用手动遍历索引,直接遍历列表中的元素,代码更简洁易读:
b = [11, 14] c = [[1,2,3],[2,3,4],[3,4,5],[4,5,6]] f = [] for sublist in c: for num in b: # 直接将子列表和[num]拼接,生成新列表 f.append(sublist + [num]) print(f)
运行这段代码就能得到你想要的结果:[[1,2,3,11], [1,2,3,14], [2,3,4,11], [2,3,4,14], [3,4,5,11], [3,4,5,14], [4,5,6,11], [4,5,6,14]]
内容的提问来源于stack exchange,提问作者Micah Comfort
相关产品推荐
相关产品推荐

