小列表的长排列

Long Permutations from Small Lists

我有一个标题为结果的列表:

outcomes = ["heads", "tails"]

如您所见,该列表有两个元素。

如果我想从列表中获取排列,我使用 itertools python 包如下:

import itertools 

for permutation in itertools.permutations(outcomes, 2):
    print(permutation)

此代码产生以下输出:

('heads', 'tails')
('tails', 'heads')

当我尝试创建比我的列表更长的排列时,问题就来了;即具有 2 个以上元素的排列。例如,如果我尝试 3 个或更多元素的排列,我没有输出:

for permutation in itertools.permutations(outcomes, 3):
    print(permutation)

对此有任何快速解决方法吗?

您正在寻找 itertools.product。排列是现有元素的排序。你描述的确实是 Cartesian product.

import itertools 

outcomes = ['heads', 'tails']
for flips in itertools.product(outcomes, repeat=3):
    print(flips)

如果您正在寻找一种(可能)效率较低(我认为产品也使用两个 for 循环)但(肯定)更冗长的方式来获得与 itertools.product 相同的结果,这正是 BrokenBenchmark 所建议的,我有一个选择:

import itertools

outcomes = ["heads", "tails"]

combinations = [] 
for combination in itertools.combinations_with_replacement(outcomes,3):
    combinations.append(combination)

final = []
for combination in combinations:

    final = final + [*itertools.permutations(combination)]


print(list(set(final)))

(我不知道 itertools.product)

输出:

[('heads', 'heads', 'tails'), 
('heads', 'heads', 'heads'), 
('tails', 'tails', 'heads'), 
('tails', 'tails', 'tails'), 
('tails', 'heads', 'heads'), 
('tails', 'heads', 'tails'), 
('heads', 'tails', 'tails'), 
('heads', 'tails', 'heads')]