列出列表的所有排列的所有组合以及替换(但顺序很重要)

问题描述 投票:0回答:1

给定一个输入列表,例如

[1, 2]
,我想获得输入列表所有可能排列的组合列表。所以类似:

排列列表:

[[1, 2], [2, 1]]

组合列表:

[[[1, 2], [1, 2]],
 [[1, 2], [2, 1]],
 [[2, 1], [1, 2]],
 [[2, 1], [2, 1]]]

要选择的对象数量等于原始列表的长度(因此每个组合有 2 个选择)

我使用 itertools 尝试过:

def generate_preferences(input_list):
    n = len(input_list)
    all_permutations = [list(p) for p in list(permutations(input_list, n))]
    all_combinations = [list(p) for p in list(combinations_with_replacement(all_permutations, n))]
    return all_combinations

但是得到了以下结果:

[[[1, 2], [1, 2]], [[1, 2], [2, 1]], [[2, 1], [2, 1]]]

而且我不确定如何指定重要的顺序,因为我最好的猜测是该函数忽略了

[[1, 2], [2, 1]]
vs
[[2, 1], [1, 2]]

python combinations permutation
1个回答
1
投票

如果顺序很重要,您不需要组合,您需要笛卡尔积。

itertools.combinations_with_replacement
替换为
itertools.product

def generate_preferences(
    input_list: list[int]
) -> Iterator[tuple[tuple[int, ...], ...]]:
    n = len(input_list)
    all_permutations = itertools.permutations(input_list)
    return itertools.product(all_permutations, repeat=n)

然后

>>> list(generate_preferences([1, 2]))

输出

[
    ((1, 2), (1, 2)), 
    ((1, 2), (2, 1)), 
    ((2, 1), (1, 2)), 
    ((2, 1), (2, 1)),
]
© www.soinside.com 2019 - 2024. All rights reserved.