函数scoreList(Rack)接收一个字母列表。您还会获得一个全局变量Dictionary:["a", "am", "at", "apple", "bat", "bar", "babble", "can", "foo", "spam", "spammy", "zzyzva"]
。
使用字母列表查找可以使用字典中的字母创建的所有可能单词。对于每个单词,也可以使用scrabbleScore找到该单词的分数。
scrabbleScore =
[ ["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,filter,reduce等),if语句和for循环组成的表达式,但仅限于它们在列表推导的上下文中。
示例:
>>> 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]]
它们的呈现顺序无关紧要。它也必须保持列表而不是dic。会对这个问题有所帮助,或者如果你能让我更好地理解如何在这个问题中使用地图或过滤器。
mycode的:
def scoreList(Rack):
test = [x for x in Dictionary if all(y in Rack for y in x)]
return test
输出:
>>> scoreList(["a", "s", "m", "t", "p"])
['a', 'am', 'at', 'spam']
正如你所看到的,我能够找到这些词,但不是得分。如何在不使用dict的情况下找到它?
答案 0 :(得分:1)
您可以使用itertools
从一组字符中生成所有可能的单词排列,但请注意,如果输入列表变大,这将成为一个耗费时间且占用大量内容的过程。
import itertools
d = dict([ ["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] ])
words = ["a", "am", "at", "apple", "bat", "bar", "babble", "can", "foo", "spam", "spammy", "zzyzva"]
def scoreList(l):
perms = itertools.chain.from_iterable(list(itertools.permutations(l,r)) for r in range(1,len(l)))
return [["".join(x),sum(d[c] for c in "".join(x))] for x in set(perms) if "".join(x) in words]
print(scoreList(["a", "s", "m", "t", "p"]))
# Outputs: [['at', 2], ['a', 1], ['spam', 8], ['am', 4]]
print(scoreList(["a", "s", "m", "o", "f", "o"]))
# Outputs: [['a', 1], ['foo', 6], ['am', 4]]
答案 1 :(得分:0)
以下是实现此目的的示例代码:
score = [["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]]
my_list = ["a", "am", "at", "apple", "bat", "bar", "babble", "can", "foo", "spam", "spammy", "zzyzva"]
score_dict = dict(score) # Storing score value as dict
def get_word_score(my_list):
return [(item, sum(score_dict[a] for a in item)) for item in my_list]
get_word_score(my_list)
# returns: [('a', 1), ('am', 4), ('at', 2), ('apple', 9), ('bat', 5), ('bar', 5), ('babble', 12), ('can', 5), ('foo', 6), ('spam', 8), ('spammy', 15), ('zzyzva', 39)]