小列表的长排列
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')]
我有一个标题为结果的列表:
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')]