4

英语中的每个字符都有一个出现的百分比,这些是百分比:

A       B       C       D       E       F       G       H       I
.0817   .0149   .0278   .0425   .1270   .0223   .0202   .0609   .0697
J       K       L       M       N       O       P       Q       R
.0015   .0077   .0402   .0241   .0675   .0751   .0193   .0009   .0599
S       T       U       V       W       X       Y       Z   
.0633   .0906   .0276   .0098   .0236   .0015   .0197   .0007

一个名为的列表letterGoodness预定义为:

letterGoodness = [.0817,.0149,.0278,.0425,.1270,.0223,.0202,...

我需要找到一个字符串的“优点”。例如,'I EAT' 的优点是:.0697 + .1270 + .0817 + .0906 =.369。这是一个更大问题的一部分,但我需要解决这个问题才能解决这个大问题。我是这样开始的:

def goodness(message):
   for i in L:
     for j in i:

因此,找出如何获得任何字符的出现百分比就足够了。你能帮助我吗?该字符串仅包含大写字母和空格。

4

2 回答 2

12

letterGoodness 作为字典更好,那么你可以这样做:

sum(letterGoodness.get(c,0) for c in yourstring.upper())
#                                             #^.upper for defensive programming

要将letterGoodness您的列表转换为字典,您可以执行以下操作:

import string
letterGoodness = dict(zip(string.ascii_uppercase,letterGoodness))

如果你保证只有大写字母和空格,你可以这样做:

letterGoodness = dict(zip(string.ascii_uppercase,letterGoodness))
letterGoodness[' '] = 0
sum(letterGoodness[c] for c in yourstring)

但是这里的性能提升可能非常小,所以我更喜欢上面更强大的版本。


如果您坚持保留letterGoodness为列表(我不建议这样做),您可以使用内置函数ord获取索引(cwallenpoole 指出):

 ordA = ord('A')
 sum(letterGoodness[ord(c)-ordA] for c in yourstring if c in string.ascii_uppercase)

我现在太懒了timeit,但是您可能还想定义一个临时集来保存string.ascii_uppercase-它可能会使您的函数运行得更快一些(取决于str.__contains__与相比的优化程度set.__contains__):

 ordA = ord('A')
 big_letters = set(string.ascii_uppercase)
 sum(letterGoodness[ord(c)-ordA] for c in yourstring.upper() if c in big_letters)
于 2012-08-24T15:21:39.863 回答
1

最好使用字典数据结构。

编辑:这不是我的原始代码,而是按照 DSM 建议的方式更新的代码。

import string

num_vals = [.0817, .0149, .0278, .0425, .1270, .0223, .0202, .0609, .0697 , .0015, .0077,
            .0402, .0241, .0675, .0751, .0193, .0009, .0599, .0633, .0906, .0276, .0098,
            .0236, .0015, .0197, .0007]

letterGoodness = {letter : value for letter,value in map(None, string.ascii_uppercase, num_vals)}

def goodness(message):
    string_goodness = 0
    for letter in message:
        letter = letter.upper()
        if letter in letterGoodness.keys():
            string_goodness += letterGoodness[letter]
    return string_goodness

print goodness("I eat")

使用您提供的测试用例:

print goodness("I eat")

产生输出:

.369

需要注意的一件事 - 像这里所做的那样构建字典需要 Python 2.7+。在 Python 2.6+ 中可以使用dict()构造函数完成同样的事情。

于 2012-08-24T15:21:48.413 回答