使用map和reduce查找单词中每个字母的值

时间:2016-10-08 21:13:59

标签: python-2.7 dictionary reduce

我有一个功能wordScore(word,scoreList)。单词是一个只包含字母的字符串,scoreList是一个包含字母表中每个字母值的列表:

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

我必须找到一个单词的总分,然后使用map和reduce返回它。例如:

wordScore('agile', scoreList)
>>> 6

我相信我无法解决这个问题,因为我不确定地图是做什么的。我真的很感激一些帮助。

第二个问题: 所以现在给我一个字母列表(比如listOfwords = ["a", "am", "at", "apple", "bat", "bar", "babble", "can", "foo", "spam", "spammy", "zzyzva"])当我在scoreList(Rack)中输入一个字母列表(例如scoreList(["a", "s", "m", "t", "p"])时,它应该输出所有可能的单词用listOfwords中的字母组成。所以基本上就是这样:

>>> scoreList(["a", "s", "m", "t", "p"])
[['a', 1], ['am', 4], ['at', 2], ['spam', 8]]
>>> scoreList(["a", "s", "m", "o", "f", "o"])
[['a', 1], ['am', 4], ['foo', 6]]

到目前为止,这是我的代码:

def scoreList(Rack):
    test = [x for x in Dictionary if all(y in Rack for y in x)]
    return test

然而,当我运行它时,它只给出了可以用字母表达的单词,而且我不确定如何获得每个单词的分数。我可以使用wordScore吗?同样的限制也适用。

1 个答案:

答案 0 :(得分:0)

Map通过将函数应用于序列中的每个项来创建序列:

>>> map(lambda x: x + 1, [1, 2, 3])
[2, 3, 4]

所以要解决你的问题:

如果您可以使用dict,请循环显示单词中的所有字母并将其映射到其分数。然后将所有字母分数与reduce相加:

def wordScore(word, score_list):
    score_dict = dict(score_list)
    letter_scores = map(lambda letter: score_dict[letter], word)
    return reduce(lambda x, y: x + y, letter_scores)

如果你不能,可以循环分数列表中的所有字母,并将每个分数乘以字母中出现的字母数,然后将所有字母分数与reduce相加:

def wordScore(word, score_list):
    letter_scores = map(
        lambda letter_score: word.count(letter_score[0]) * letter_score[1], 
        score_list
    )
    return reduce(lambda x, y: x + y, letter_scores)

阅读map documentation in python 2.7