You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从指定列表生成大小为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:13:48