将字典中的值相乘(如果它存在于列表中)

Multiplying values from a dictionary if it exists in a list

我正在尝试计算一些句子概率。

我有一本字典,其中包含一些不同字母的值:

{'a': 0.2777777777777778, 'b': 0.3333333333333333, 'c': 0.3888888888888889}

然后我在列表中有单独的句子,例如:

['aabc', 'abbcc', 'cba', 'abcd', 'adeb']

我想做的是一些概率计算,以便它搜索列表中的句子并将值相乘,例如 aabc 将是 0.2777*0.2777*0.3333*0.388888

我如何在这个列表中搜索每个独立的字符串并进行乘法运算?

这是一种非常简单的方法:

values = {'a': 0.2777777777777778, 'b': 0.3333333333333333, 'c': 0.3888888888888889, 'd':0.1234, 'e':0.5678}

strings = ['aabc', 'abbcc', 'cba', 'abcd', 'adeb']

for string in strings:
  product = 1
  for char in string:
    product *= values[char]

  print(product)

编辑:

如果我们想使用检查字典是否有值,我们可以执行以下操作并使用 unk 代替:

values = {'a': 0.2777777777777778, 'b': 0.3333333333333333, 'c': 0.3888888888888889}

strings = ['aabc', 'abbcc', 'cba', 'abcd', 'adeb']

unk = 0.05

for string in strings:
  product = 1
  for char in string:
    if char in values:
      product *= values[char]
    else:
      product *= unk

  print(product)

您可以使用双 for 循环。外层 for 会遍历句子列表,而内层 for 会遍历句子中的每个字母。 Python for 循环语法是 for item in iterable_object: <code to run>。尝试使用此信息,看看您能走多远。

你可以用reduce把你的句子归约成它最终的概率(注意如果一个字符没有概率,我就用1乘):

from functools import reduce

probs = {'a': 0.2777777777777778, 'b': 0.3333333333333333, 'c': 0.3888888888888889}
sentences = ['aabc', 'abbcc', 'cba', 'abcd', 'adeb']

result = [reduce(lambda acc, curr: probs.get(curr, 1) * acc, s, 1) for s in sentences]
print(result) 
# [0.010002286236854138, 0.004667733577198597, 0.0360082304526749, 0.03600823045267489, 0.09259259259259259]

您可以使用列表理解和 for 循环来执行此操作。

def prob(string, prob):
    out = 1;
    probs = [prob[char] for char in string]
    for x in probs:
        out *= x;
    return out

prob 是概率字典,string 是字符串。 in 遍历字符串中的每个字符。