我应该使用sympy.utilities.iterables.variations()来获得permutations_with_replacement吗?

时间:2019-01-10 12:21:56

标签: python sympy

我正在尝试使用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?

1 个答案:

答案 0 :(得分:1)

variations方法完全按照您的想法去做,即计算包方法的笛卡尔乘积,恰当地命名为product

这意味着list(sympy.utilities.iterables.product('abc', repeat=2)将产生相同的结果。 对于repetition=Falsevariations等于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