如何在 python 上包含给定元素集的所有排列和组合概率?

问题描述 投票:0回答:1

我有这个代码:

mainList = ['a', 'b', 'c', 'd']
itemList = []
for i in range(0, len(mainList)):
    strs = ""
    for j in range(0, i+1):
        strs += mainList[j]
    itemList.append(strs)

inp = ""
for y in mainList:
    inp += y

for i in range(0, len(inp)):
    prob = ""
    for j in range(0, i+1):
        prob += inp[j]
    if(itemList.__contains__(prob)):
        if len(prob) > 1:
            print("Probability of " + prob + " is 100%")
        else:
            print("Probability of " + prob + " is " + str(round((1/len(mainList))*100, 0)) + "%")
    else:
        print("Probability of " + prob + " is 0%")

它打印“a 的概率为 25.0% ab 的概率为 100% abc 的概率为 100% abcd 的概率是 100%”

我想要的只是有人帮助我确保它根据数据的排列方式打印所有其他排列和组合及其相应的概率。如bc、cc、dd、aa、bb、bca、aaa等。每种排列和组合都可用,最多可达给定集合中的元素数量,在本例中为 4。

感谢您的宝贵时间。

我尝试用自己的经验,但不知道从哪里开始。

这也许是显而易见的,但对我来说绝对不是。

python combinations element permutation
1个回答
0
投票

“...每种排列和组合都可用,最多可达给定集合中的元素数量,在本例中为 4。...”

首先生成所有排列的列表。
itertools模块方便地提供了permutations功能。

import itertools as i
l = ['a', 'b', 'c', 'd']
V = []
for x in i.chain(*(i.permutations(l, r) for r in range(1, len(l) + 1))):
    V.append(list(x))

从这里开始,将 Va 的出现次数除以可能出现的总次数。

d = {}
N = len(V) - 1
for z in range(N + 1):
    for i, a in enumerate(V):
        M = 0
        n = len(s := {*a})
        for j, b in enumerate(V):
            if i == j or len(b) < n: continue
            if not s == {*b}: M += 1
        d.update({tuple(a): M / N})

输出

a = 100.000000% = 1.0
b = 100.000000% = 1.0
c = 100.000000% = 1.0
d = 100.000000% = 1.0
ab = 92.063492% = 0.9206349206349206
ac = 92.063492% = 0.9206349206349206
ad = 92.063492% = 0.9206349206349206
ba = 92.063492% = 0.9206349206349206
bc = 92.063492% = 0.9206349206349206
bd = 92.063492% = 0.9206349206349206
ca = 92.063492% = 0.9206349206349206
cb = 92.063492% = 0.9206349206349206
cd = 92.063492% = 0.9206349206349206
da = 92.063492% = 0.9206349206349206
db = 92.063492% = 0.9206349206349206
dc = 92.063492% = 0.9206349206349206
abc = 66.666667% = 0.6666666666666666
abd = 66.666667% = 0.6666666666666666
acb = 66.666667% = 0.6666666666666666
acd = 66.666667% = 0.6666666666666666
adb = 66.666667% = 0.6666666666666666
adc = 66.666667% = 0.6666666666666666
bac = 66.666667% = 0.6666666666666666
bad = 66.666667% = 0.6666666666666666
bca = 66.666667% = 0.6666666666666666
bcd = 66.666667% = 0.6666666666666666
bda = 66.666667% = 0.6666666666666666
bdc = 66.666667% = 0.6666666666666666
cab = 66.666667% = 0.6666666666666666
cad = 66.666667% = 0.6666666666666666
cba = 66.666667% = 0.6666666666666666
cbd = 66.666667% = 0.6666666666666666
cda = 66.666667% = 0.6666666666666666
cdb = 66.666667% = 0.6666666666666666
dab = 66.666667% = 0.6666666666666666
dac = 66.666667% = 0.6666666666666666
dba = 66.666667% = 0.6666666666666666
dbc = 66.666667% = 0.6666666666666666
dca = 66.666667% = 0.6666666666666666
dcb = 66.666667% = 0.6666666666666666
abcd = 0.000000% = 0.0
abdc = 0.000000% = 0.0
acbd = 0.000000% = 0.0
acdb = 0.000000% = 0.0
adbc = 0.000000% = 0.0
adcb = 0.000000% = 0.0
bacd = 0.000000% = 0.0
badc = 0.000000% = 0.0
bcad = 0.000000% = 0.0
bcda = 0.000000% = 0.0
bdac = 0.000000% = 0.0
bdca = 0.000000% = 0.0
cabd = 0.000000% = 0.0
cadb = 0.000000% = 0.0
cbad = 0.000000% = 0.0
cbda = 0.000000% = 0.0
cdab = 0.000000% = 0.0
cdba = 0.000000% = 0.0
dabc = 0.000000% = 0.0
dacb = 0.000000% = 0.0
dbac = 0.000000% = 0.0
dbca = 0.000000% = 0.0
dcab = 0.000000% = 0.0
dcba = 0.000000% = 0.0
© www.soinside.com 2019 - 2024. All rights reserved.