我正在尝试使用sympy的排列无需替换
from sympy.functions.combinatorial.numbers import nP
from sympy.utilities.iterables import permutations
nP('abc', 2)
# >>> 6
list(permutations('abc', 2))
# >>> [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
接下来,我将不尝试替换的排列。似乎没有一种类似于permuations_with_replacement()
方法的combinations_with_replacement()
方法,但是有一种variations()
方法:
from sympy.utilities.iterables import variations
nP('abc', 2, replacement=True)
# >>> 9
list(variations('abc', 2, repetition=True))
# >>>
[('a', 'a'),
('a', 'b'),
('a', 'c'),
('b', 'a'),
('b', 'b'),
('b', 'c'),
('c', 'a'),
('c', 'b'),
('c', 'c')]
variations()
方法执行与我期望permutations_with_replacement()
执行的功能相同的功能吗?
另请参阅:sympy.utilities.iterables.combinations() with replacement?
答案 0 :(得分:1)
variations
方法完全按照您的想法去做,即计算包方法的笛卡尔乘积,恰当地命名为product
。
这意味着list(sympy.utilities.iterables.product('abc', repeat=2)
将产生相同的结果。
对于repetition=False
,variations
等于permutations
。
这也可以从variations
的内部代码中看到:
if not repetition:
seq = tuple(seq)
if len(seq) < n:
return
for i in permutations(seq, n):
yield i
else:
if n == 0:
yield ()
else:
for i in product(seq, repeat=n):
yield i