给出一本字典和一个字母列表,找出所有可以用字母创建的单词

2024-05-19 20:11:46 发布

您现在位置:Python中文网/ 问答频道 /正文

函数scoreList(Rack)接受一个字母列表。您还将获得一个全局变量字典:["a", "am", "at", "apple", "bat", "bar", "babble", "can", "foo", "spam", "spammy", "zzyzva"]。在

使用字母列表查找字典中所有可能的单词。对于每个可以生成的单词,也可以使用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循环组成的表达式,但前提是它们是在列表理解的上下文中。在

示例:

^{pr2}$

它们呈现的顺序并不重要。它还必须是一个列表,而不是dic。如果你能让我更好地理解如何在这个问题中使用map或filter,我会很乐意为这个问题提供一些帮助。在

霉菌:

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怎么能找到它?在


Tags: intestmap列表forif字典字母
2条回答

下面是实现此目的的示例代码:

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)]

您可以使用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]]

相关问题 更多 >