给定一个输入列表,例如
[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]]
如果顺序很重要,您不需要组合,您需要笛卡尔积。
将
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)),
]