创建使用列表中的键返回分数的程序

问题描述 投票:1回答:3

我基本上试图读取一个txt文件,删除不在字母表中的所有符号和标点符号(A-Z),然后生成一个输出,用于并排显示文件中的所有单词。为了获得分数,我试图将单词的每个字母与一个键进行比较。这个键代表了这封信的价值。通过将给定单词的所有字母值相加,我将获得该单词的总分。

alphakey = {'a': 5, 'b': 7, 'c': 4, 'd': 3, 'e': 7, 'f': 3,
         'g': 3, 'h': 5, 'i': 2, 'j': 2, 'k': 1, 'l': 2,
         'm': 6, 'n': 3, 'o': 1, 'p': 2, 'q': 1, 'r': 4,
         's': 3, 't': 7, 'u': 5, 'v': 5, 'w': 2, 'x': 1,
         'y': 2, 'z': 9}

这是我到目前为止所做的,但我完全陷入困境。

with open("hunger_games.txt") as p:
    text = p.read()
    text = text.lower()

text = text.split()
new = []
for word in text:
    if word.isalpha() == False:
        new.append(word[:-1])
    else:
        new.append(word)

class TotalScore():

    def score():
        total = 0
        for word in new:
            for letter in word:
                total += alphakey[letter]
            return total

我想要得到类似的东西:

   you 5
   by 4
   cool 10

等等..列表中的所有单词。在此先感谢您的帮助。

python key python-3.5
3个回答
1
投票

正如评论中指出的那样,你不需要有一个类,你的回报是错误缩进的,否则我认为你的score函数可以做你需要的计算总分。

如果你需要一个单词分数,你可以再次使用一个字典,来存储这些:

def word_score(word):
  return sum(alphakey[l] for l in word)

def text_scores(filename):
  with open(filename) as p:
    text = p.read()
  text = re.sub(r'[^a-zA-Z ]', '', text.lower())
  return {w: word_score(w) for w in text.split()}

print(text_scores("hunger_games.txt"))

如果hunger_games.txt包含“you by cool”,则会打印:

{'you': 8, 'by': 9, 'cool': 8}

1
投票

是否必须删除标点符号?或者你这样做,以便你可以匹配字典的键?如果您对标点符号保持不变,那么可以通过几行解决:

alphakey = {'a': 5, 'b': 7, 'c': 4, 'd': 3, 'e': 7, 'f': 3,
     'g': 3, 'h': 5, 'i': 2, 'j': 2, 'k': 1, 'l': 2,
     'm': 6, 'n': 3, 'o': 1, 'p': 2, 'q': 1, 'r': 4,
     's': 3, 't': 7, 'u': 5, 'v': 5, 'w': 2, 'x': 1,
     'y': 2, 'z': 9}

with open("hunger_games.txt") as p:
    text = p.read()
    text = text.lower()

    words = text.split()
    uniqueWords = {}

    for word in words:
        if not word in uniqueWords:
            uniqueWords[word] = sum([alphakey[letter] for letter in word if letter.isalpha()])

    print(uniqueWords)

最后一行可能需要一些解释。首先

[alphakey[letter] for letter in word if letter.isalpha()]

是一个称为“列表理解”的例子。它们是Python的一个非常有用的功能,它允许我们在一行中创建一个完整的列表。我刚刚列出的那个将通过“单词”中的每个字母,如果它是按字母顺序排列的,它将返回“alpha key”中的值。例如,如果这个词是:

"hello"

它会返回列表:

[5, 7, 2, 2, 1]

如果这个词是:

"w4h&t"

列表理解将忽略“4”和“&”并返回列表:

[2, 5, 7]

要将它们转换为单个值,我们将理解包装为sum函数。因此,对于单词“hello”,最终值为17,对于“w4h&t”,最终值为14。


0
投票

我建议你使用nltk进行文本操作。这是我的解决方案(你可以缩小一些代码块,我只是让它在视觉上更容易理解)。

基本上你将文本分成单词列表,然后我们可以使用set()函数删除所有重复项,然后我们循环计算得分的所有单词。我希望代码很清楚。

import nltk

alphakey = {'a': 5, 'b': 7, 'c': 4, 'd': 3, 'e': 7, 'f': 3,
         'g': 3, 'h': 5, 'i': 2, 'j': 2, 'k': 1, 'l': 2,
         'm': 6, 'n': 3, 'o': 1, 'p': 2, 'q': 1, 'r': 4,
         's': 3, 't': 7, 'u': 5, 'v': 5, 'w': 2, 'x': 1,
         'y': 2, 'z': 9}

text = """
boy girl girl boy dog Dog car cAr dog girl you by cool 123asd .asd; 12asd
"""

words = []
results = {}

sentences = nltk.sent_tokenize(text)
for sentence in sentences:
    words += nltk.word_tokenize(sentence)

words = list(set([word.lower() for word in words]))

for word in words:
    if word.isalpha():
        total = 0
        for letter in word:
            total += alphakey[letter]
        results[word] = total


for val in results:
    print(f"{val} {results[val]}")

输出:

dog 7
you 8
by 9
boy 10
cool 8
car 13
girl 11
© www.soinside.com 2019 - 2024. All rights reserved.