如何从指定列表生成大小为N的有序排列列表?(附示例)
生成列表中指定大小的有序元素组合(匹配你的示例输出)
首先得澄清下:从你给出的示例输出来看,你要的其实是无重复元素、且保持原列表相对顺序的组合(而非严格意义上的全排列,因为全排列会包含反向的元素对,比如[(1,2),(1,1)]这类)。下面给你两种实现方案:
方案1:利用Python标准库快速实现
Python的itertools模块里有现成的工具可以直接用,一行核心代码就能搞定:
from itertools import combinations def permutations(input_list, n, output_list): # 把生成的组合转换成列表格式,添加到输出列表中 output_list.extend(list(map(list, combinations(input_list, n)))) # 测试你的示例场景 input_list = [(1,1),(1,2),(1,3),(1,4)] n = 2 ListOut = [] permutations(input_list, n, ListOut) print(ListOut) # 输出:[[(1,1),(1,2)], [(1,1),(1,3)], [(1,1),(1,4)], [(1,2),(1,3)], [(1,2),(1,4)], [(1,3),(1,4)]]
说明:
combinations(input_list, n)会生成输入列表中所有长度为n的不重复元素组合,且组合内元素的顺序和原列表完全一致,完美匹配你的需求。- 如果之后你需要真正的全排列(包含所有元素顺序的排列,比如
[(1,2),(1,1)]),只需要把combinations换成itertools.permutations即可,此时输出会有4*3=12个元素。
方案2:手动实现回溯法(不依赖标准库)
如果你不想用标准库,也可以用回溯算法手动实现这个逻辑,更灵活可控:
def permutations(input_list, n, output_list): list_length = len(input_list) def backtrack(start_index, current_subset): # 当当前子集长度达到n时,添加到输出列表 if len(current_subset) == n: output_list.append(current_subset.copy()) return # 从start_index开始遍历,避免重复选取同一元素和逆序组合 for i in range(start_index, list_length): current_subset.append(input_list[i]) backtrack(i + 1, current_subset) current_subset.pop() # 回溯,移除最后添加的元素 backtrack(0, []) # 测试示例 input_list = [(1,1),(1,2),(1,3),(1,4)] n = 2 ListOut = [] permutations(input_list, n, ListOut) print(ListOut) # 输出和示例完全一致
说明:
- 回溯法通过递归遍历,每次从当前元素的下一个位置开始选取元素,确保不会重复选取同一元素,同时保持原列表的元素顺序,最终生成符合要求的结果。
内容的提问来源于stack exchange,提问作者Big Bear
相关产品推荐
相关产品推荐

