列表中的值,python

Reg*_*ald 4 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   .0241   .0675   .0751   .0193   .0009   .0599
S       T       U       V       W       X       Y       Z   
.0633   .0906   .0276   .0098   .0236   .0015   .0197   .0007
Run Code Online (Sandbox Code Playgroud)

调用的列表letterGoodness预定义为:

letterGoodness = [.0817,.0149,.0278,.0425,.1270,.0223,.0202,...
Run Code Online (Sandbox Code Playgroud)

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

def goodness(message):
   for i in L:
     for j in i:
Run Code Online (Sandbox Code Playgroud)

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

mgi*_*son 12

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

sum(letterGoodness.get(c,0) for c in yourstring.upper())
#                                             #^.upper for defensive programming
Run Code Online (Sandbox Code Playgroud)

要从letterGoodness列表转换为dictonary,您可以执行以下操作:

import string
letterGoodness = dict(zip(string.ascii_uppercase,letterGoodness))
Run Code Online (Sandbox Code Playgroud)

如果您保证只有大写字母和空格,您可以:

letterGoodness = dict(zip(string.ascii_uppercase,letterGoodness))
letterGoodness[' '] = 0
sum(letterGoodness[c] for c in yourstring)
Run Code Online (Sandbox Code Playgroud)

但这里的性能提升可能非常小,所以我赞成上面更强大的版本.


如果你坚持保持letterGoodness列表(我不建议),你可以使用内置ord来获取索引(由cwallenpoole指出):

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

我现在太懒了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)
Run Code Online (Sandbox Code Playgroud)

  • 为了避免非字母问题,我会使用`letterGoodness.get(i.upper(),0)`而不是进行成员资格测试. (5认同)
  • @Reginald练习防守编程. (2认同)