如何代表多个级别的组合?

时间:2019-01-14 09:32:58

标签: python sympy

Blitzstein和Hwang的书Introduction to Probability提供了使用冰淇淋进行组合的示例。

  • 第一级为圆锥形:华夫饼干蛋糕
  • 第二个层次是风味:巧克力香草草莓

基本示例是print(animal_list)个单独的选择。

我可以分别代表每个选择级别:

2 * 3 = 6

我想知道是否可以将级别与sympy组合在一起并返回每个组合的列表以及可用组合的数量?

2 个答案:

答案 0 :(得分:2)

您需要的是cartes

from sympy.utilities.iterables import cartes

print list(cartes('CW', 'csv'))
# >>> [('C', 'c'), ('C', 's'), ('C', 'v'), ('W', 'c'), ('W', 's'), ('W', 'v')]

print [''.join(x) for x in list(cartes('CW', 'csv'))]
# >>> ['Cc', 'Cs', 'Cv', 'Wc', 'Ws', 'Wv']

print len(list(cartes('CW', 'csv')))
# >>> 6

答案 1 :(得分:1)

您正在做的是设置乘法。例如{A,B} * {1,2}-> {{A,1},{A,2},{B,1},{B,2})。在python中,您可以使用itertools.product

from itertools import product

allChoices = set(product(set('CW'), set('csv')))
allChoicesPretty = set(a+b for a, b in allChoices)
numberOfChoices = len(allChoices)

print(allChoices)
print(allChoicesPretty)
print(numberOfChoices)

输出:

{('C', 'v'), ('W', 's'), ('W', 'c'), ('C', 'c'), ('C', 's'), ('W', 'v')}
{'Wv', 'Ws', 'Cs', 'Wc', 'Cc', 'Cv'}
6

实际上,您根本不需要sympy,而且cartes实际上是iterable.product [1]的别名

评论

set中,每个元素仅发生一次,并且在set中没有顺序。如果您需要这两者之一,请用set替换list,用{}替换[]。例如,当您从书包中拿出一个物品放回去时,这可能很重要。但是对集合的操作更快。使用集合时多次出现“相同事件”的一种方法是添加标签,例如数字,例如A,A,A-> A1,A2,A3。这样思考是非常实用的,因为考虑概率时,通常更容易考虑带有标签的事件(或计算概率),然后在处理概率时删除标签(相当于说“顺序无关紧要”)。

这与以下事实有关:在数学中,我们可以表达(解释,构建)集合论中的所有内容。[2]实际上,它几乎不需要证明理论的演绎元素 [4];这是一种建立数学基础的方法(ZFC:= Zermelo Fraenkel Choice)。所有的数学证明都发生在ZFC内部,但几乎从未在证明中提及。

还有其他解释所有数学的方法,例如类别理论 [3],它与计算语言密切相关。我知道的第三个可能的基础是同伦类型理论 [5,6],到目前为止,由于该领域是一个非常新的领域,我们可以做更少的事情,但是我们可以做的不是自然的,而是从概念上讲非常有趣。

[1] https://github.com/sympy/sympy/blob/da9fdef5e00f40dfd500bfa356c61ce6bad1b559/sympy/utilities/iterables.py#L6

[2] https://en.wikipedia.org/wiki/Set_theory

[3] https://en.wikipedia.org/wiki/Category_theory

[4] https://en.wikipedia.org/wiki/Proof_theory

[5] https://en.wikipedia.org/wiki/Homotopy_type_theory

[6] https://homotopytypetheory.org/book/