使用 map 和 reduce 查找单词中每个字母的值
Finding the value of each letter in a word using map and reduce
我有一个函数 wordScore(word, scoreList)。 word 是一个仅由字母组成的字符串,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] ]
我必须找到一个单词的总分,然后 return 使用 map 和 reduce 得到它。示例:
wordScore('agile', scoreList)
>>> 6
我认为我无法解决这个问题,因为我不确定 map 是做什么的。非常感谢您的帮助。
第二个问题:
所以现在我得到了一个字母列表(假设 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 吗?同样的限制也适用。
Map 通过对序列中的每个项目应用函数来创建序列:
>>> map(lambda x: x + 1, [1, 2, 3])
[2, 3, 4]
所以解决你的问题:
如果你可以使用dict
,遍历word中的所有字母并将其映射到它的分数。然后用 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)
我有一个函数 wordScore(word, scoreList)。 word 是一个仅由字母组成的字符串,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] ]
我必须找到一个单词的总分,然后 return 使用 map 和 reduce 得到它。示例:
wordScore('agile', scoreList)
>>> 6
我认为我无法解决这个问题,因为我不确定 map 是做什么的。非常感谢您的帮助。
第二个问题:
所以现在我得到了一个字母列表(假设 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 吗?同样的限制也适用。
Map 通过对序列中的每个项目应用函数来创建序列:
>>> map(lambda x: x + 1, [1, 2, 3])
[2, 3, 4]
所以解决你的问题:
如果你可以使用dict
,遍历word中的所有字母并将其映射到它的分数。然后用 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)