列表中的值,python

列表中的值,python,python,python-3.x,Python,Python 3.x,英语中的每个字符都有出现的百分比,以下是百分比: 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

英语中的每个字符都有出现的百分比,以下是百分比:

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,...
我需要找到字符串的“优点”。例如,“我吃”的好处是:.0697+.1270+.0817+.0906=.369。这是一个更大问题的一部分,但我需要解决这个问题来解决这个大问题。我是这样开始的:

def goodness(message):
   for i in L:
     for j in i:
因此,了解如何获得任何字符的出现百分比就足够了。你能帮助我吗?
字符串仅包含大写字母和空格。

作为字典,LetterGoods更好,那么您只需执行以下操作:

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)
如果保证只包含大写字母和空格,则可以执行以下操作:

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
来获取索引(由cwallenpole指出):

我现在懒得
timeit
,但您可能还想定义一个临时集来保存
字符串。ascii\u大写字母
——这可能会使您的函数运行得更快一点(取决于
str.\uu contains\uuuuuuuuu
集相比的优化程度)


最好使用字典数据结构

编辑:这不是我的原始代码,而是按照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+。在Python2.6+中,使用
dict()
构造函数可以完成同样的事情。

您有一个长度为26的数组。字符串中的每个字符都有一个ascii数字。编写一个方法,将ascii数字转换为正确的数组索引。然后,您可以简单地对字符串进行迭代,以O(n)的形式求和优度值。新编辑:如果你的字符串只有大写字母,那么是的,字典将不再需要我描述的哈希函数。但是别忘了丢弃非字母字符。啊,我看到你今天也在浏览python问题。比我快8秒,还有代码要启动。我明天可能会回来:d为了避免非字母问题,我会使用
letterGoodness.get(I.upper(),0)
而不是进行成员资格测试。字符串只是大写字符,我现在就编辑我的帖子,抱歉。@Reginald练习防御性编程。在我将复制内容提取出来之前,我无法确定我会接受多少重复行,但我相信26行是超过它的。我认为大多数Python程序员会做一些更像@mgilson所做的事情,并且对此有些怀疑。这是一个有效的评论。我自己在编辑器中使用find/replace提取了重复,但这对代码输出没有影响-结果并不完美。
map(None,…)
最好写成
zip(…)
。我从未见过
zip(
写成
map)(无,
…有趣。哪一个先到?
map
zip
?这些知识可能对python考古学有用…@mgilson在2.0版中列出了一个新的
zip()
,而
map()
没有这样的限定符,因此,假设省略是故意的,
map()
是O.G.的方法。