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

注意すべき点の1つは、ここで行われているように辞書を作成するには、Python2.7以降が必要です。Python 2.6以降でも、コンストラクターを使用して同じことを実行できますdict()

于 2012-08-24T15:21:48.413 に答える