如何在Python中实现含部分列表位置交换的排列组合?
实现固定部分列表位置+指定列表交换位置的排列组合
方法一:直接生成两种组合后合并
你原来的代码是固定list1→list2→list3→list4的顺序生成笛卡尔积,要添加list2和list3交换位置的组合,最简单的方式就是分别生成两种顺序的组合,再把结果合并:
list1 = [1] list2 = [6, 7, 8] list3 = [9, 10, 11] list4 = [12] print("The original lists are : " + str(list1) + " " + str(list2) + " " + str(list3) + " " + str(list4)) # 原顺序的组合:list1→list2→list3→list4 res_original = [[i, j, k, l] for i in list1 for j in list2 for k in list3 for l in list4] # 交换list2和list3后的组合:list1→list3→list2→list4 res_swapped = [[i, k, j, l] for i in list1 for j in list2 for k in list3 for l in list4] # 合并两组结果 res = res_original + res_swapped print("All possible permutations are:") for perm in res: print(*perm)
运行后会先输出你原来的固定顺序结果,接着输出list2和list3交换后的所有组合,完全符合需求。
方法二:更灵活的扩展方式(支持多列表交换)
如果以后需要对更多列表做位置交换,手动写多个推导式会很麻烦,可以用Python标准库itertools里的工具简化操作:
from itertools import product, permutations list1 = [1] list2 = [6, 7, 8] list3 = [9, 10, 11] list4 = [12] # 把需要交换位置的列表放在一起 variable_lists = [list2, list3] # 生成可变列表的所有排列方式(这里2个列表,会得到原顺序和交换顺序两种) variable_permutations = permutations(variable_lists) res = [] # 遍历每一种排列方式 for perm in variable_permutations: # 用product生成固定列表+当前排列的可变列表的笛卡尔积 for combo in product(list1, *perm, list4): res.append(list(combo)) print("The original lists are : " + str(list1) + " " + str(list2) + " " + str(list3) + " " + str(list4)) print("All possible permutations are:") for item in res: print(*item)
这个方法的好处是:如果以后你想让3个列表任意交换位置,只需要把这3个列表放进variable_lists里,代码会自动生成所有可能的位置排列对应的组合,不用修改其他逻辑。
内容的提问来源于stack exchange,提问作者S DD
相关产品推荐
相关产品推荐

