Blitzstein和Hwang的书Introduction to Probability提供了使用冰淇淋进行组合的示例。
基本示例是print(animal_list)
个单独的选择。
我可以分别代表每个选择级别:
2 * 3 = 6
我想知道是否可以将级别与sympy组合在一起并返回每个组合的列表以及可用组合的数量?
答案 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],到目前为止,由于该领域是一个非常新的领域,我们可以做更少的事情,但是我们可以做的不是自然的,而是从概念上讲非常有趣。
[2] https://en.wikipedia.org/wiki/Set_theory
[3] https://en.wikipedia.org/wiki/Category_theory
[4] https://en.wikipedia.org/wiki/Proof_theory