列表中的值,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.的方法。