【问题标题】:Python - scrabble word countPython - 拼字游戏字数
【发布时间】:2020-01-13 18:44:36
【问题描述】:

我需要为拼字游戏编写一个简短的程序,给定一个单词它可以计算分数。

我是 python 新手,仍在研究如何组合列表。 对解决方案的任何帮助或解释将不胜感激。

我想我必须声明每个列表都等于一个数字,然后使用它来计算如何查看一个单词并计算该分数。

谁能给我一个解决方案并告诉我各个要点?

one_letter_point = ['e', 'a', 'o', 't', 'i', 'n', 'r', 's', 'l', 'u'] 
two_letter_point = ['d', 'g']
three_letter_point = ['c', 'm', 'b', 'p']
four_letter_point = ['h', 'f', 'w', 'y', 'v']
five_letter_point = ['k']
eight_letter_point = ['j', 'x']
ten_letter_point = ['q', 'z']

def scrabble_word_count(word):

    one_letter_word = 1 #do the same for the rest and then not sure what to do

    return scrabble_word_count(word) # not sure if this is supposed to be done 

print answer_word('zoo')

我有这种替代方法,但它只查看第一个字母并指出这一点。例如apple = 1 的点数。因为它只查看 a。

def scrabble_word_count(word):
   score = 0
   for letter in word:
    if letter in one_letter_point:
        score += 1
    elif letter in two_letter_point:
        score += 2
    elif letter in three_letter_point:
         score += 3
    elif letter in four_letter_point:
         score += 4
    elif letter in five_letter_point:
          score += 5
    elif letter in eight_letter_point:
          score += 8
    elif letter in ten_letter_point:
          score += 10
    return score

    print(scrabble_word_count('apple'))

【问题讨论】:

  • 你的代码有缩进错误
  • 更好的方法是使用将字母映射到分数的字典。 {"a": 1, "b": 3, ...}
  • @Barmar 我可以这样做,它更简单,但我被告知我必须这样做。
  • 这里的答案是正确的,因为您应该进行从字母到分数的映射。如果你想把它扩展到做更复杂的事情(比如考虑乘数),那么看看我在大学里做的拼字游戏项目:github.com/FermenFlo/Scrabble-Solver/blob/master/src/…。你可以看到我们也有一个score_map 属性。随意闲逛。
  • 您现在可以考虑接受答案或发表评论以获取详细信息;)以奖励那些为您花费时间的人;)

标签: python arrays python-3.x list


【解决方案1】:

你需要指定字母和值的对应关系,更好的快速访问是每个字母都有一个简单的对应关系。

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

然后对于单词的每个字母,在score dict 中找到它并求和

# simple for loop style
def scrabble_word_count(word):
    res = 0
    for letter in word:
        res += score[letter]
    return res

# functionnal style
def scrabble_word_count(word):
    return sum(map(score.get, word))

使用单独的列表:

one_letter_point = ['e', 'a', 'o', 't', 'i', 'n', 'r', 's', 'l', 'u']
two_letter_point = ['d', 'g']
three_letter_point = ['c', 'm', 'b', 'p']
four_letter_point = ['h', 'f', 'w', 'y', 'p']
five_letter_point = ['k']
eight_letter_point = ['j']
ten_letter_point = ['q', 'z']

def scrabble_word_count(word):
    res = 0
    for letter in word:
        if letter in one_letter_point:
            res += 1
        elif letter in two_letter_point:
            res += 2
        elif letter in three_letter_point:
            res += 3
        elif letter in four_letter_point:
            res += 4
        elif letter in five_letter_point:
            res += 5
        elif letter in eight_letter_point:
            res += 8
        elif letter in ten_letter_point:
            res += 10
    return res

【讨论】:

  • 谢谢。我的任务是以两种方式展示这一点。一个带有映射,一个如上所述。我了解映射方法,因为它使用起来要简单得多。但是,按照我被告知的方式进行操作时,我不明白如何处理各个列表。
  • 这不是一个糟糕的任务,因为这意味着你需要学习如何想出多种方法来解决某个问题。 @ps
  • @ps 以此开头:假设只有两种字母:值一分的和值零的。您如何检查一个字母是否在该单字母点列表中? (如果你不知道,你可以谷歌“如何检查列表成员 python)。然后,一旦你编写并工作,在等式中添加第二个列表......
  • @BenQuigley 会不会是 x, z in 8 个字母点和 10 个字母点
  • @ps 我有带列表的版本,还有别的吗?
【解决方案2】:

好的开始,但是您的数据结构会产生问题。好的,所以对于five_letter_point = ['k'],我们知道一个“k”值五分。我们如何从它存储在包含单词“五”的变量名下的事实中提取该数据?我们真的做不到。

让我们改用dict,它在 Python 的上下文之外也称为哈希图。例如,使用secret_identities = {"Batman": "Bruce Wayne", "Kal-El": "Superman"},您可以查找secret_identities['Batman'] 并了解蝙蝠侠是布鲁斯韦恩。或者在你的情况下:

letter_scores = {
    'e': 1,
    'a': 1,
    ...
    'd': 2,
    ...
}

现在分数被存储为一个字典,它将每个字母映射到它获得的点数。例如,您可以将'e' 的分数向上查找letter_scores['e'],它应该返回数字1

【讨论】:

  • 谢谢,有人要求我这样做,我已经做了一个使用映射的版本
  • 对不起@IzaakvanDongen!
【解决方案3】:

根据字母所在的列表,使用多个if 语句为分数添加适当的值。

def scabble_word_count(word):
    score = 0
    for letter in word:
        if letter in one_letter_point:
            score += 1
        elif letter in two_letter_point:
            score += 2
        elif letter in three_letter_point:
            score += 3
        ...
    return score

您可以通过将所有字母列表放入另一个列表来避免所有重复代码。对没有任何字母的点使用空列表。

all_letters = [
    one_letter_point, two_letter_point, three_letter_point, four_letter_point, five_letter_point, 
    [], [], [], eight_letter_point, [], ten_letter_point
]
def scrabble_word_count(word):
    score = 0
    for letter in word:
        for index, letters in enumerate(all_letters):
            if letter in letters:
                score += index + 1 # indexes start at 0, points start at 1
                break
    return score

【讨论】:

  • 谢谢你,对于第一个,我如何让它看这个词的其余部分。当我尝试它时,它只查看第一个字母并给我那个点。而对于第二种方法,它给出了太多“解包”的错误
  • for letter in word 应该让它查看所有字母。确保return score 语句不在循环中。
  • 在第二个中我忘了调用enumerate() 来获取索引。
  • 你可以把空列表放在那里。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
相关资源
最近更新 更多