【问题标题】:Given a Dictionary and a list of letters, find all possible words that can be created with the letters给定一个字典和一个字母列表,找到所有可以用这些字母创建的单词
【发布时间】:2017-02-17 16:13:14
【问题描述】:

函数 scoreList(Rack) 接收一个字母列表。您还将获得一个全局变量 Dictionary:["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 循环组成的表达式,但前提是它们位于列表解析的上下文中。

例子:

>>> 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。希望对这个问题有所帮助,或者如果你能让我更好地了解如何在这个问题中使用地图或过滤器。

我的代码:

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

【问题讨论】:

  • 您的示例答案中的数字是多少?
  • 很遗憾,不,我想我的问题可能措辞错误。您输入自己的字母列表,任何字母。字典中任何可以用这些字母组成的单词都会连同它的分数一起输出。我也忘了说它必须是一个列表。很抱歉造成误解。

标签: python list dictionary


【解决方案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]]

【讨论】:

  • 感谢您的帮助!有没有办法在不使用 itertools 并且不将分数记入您知道的字典的情况下做到这一点?
  • @VinceCarter 为什么?当然有一些方法,你可以使用列表索引而不是字典,但我不推荐它。您可以在本机 python 中编写自己的 itertools 或类似工具,请参阅文档:docs.python.org/3.4/library/…
  • 老实说,这是家庭作业。但是,我已将我的帖子编辑为我能够得到的内容,直到我陷入困境。
  • 解决这个问题的方法很大程度上取决于您允许使用的最大字母数量以及您需要多快得到答案。请记住,10 个字母的排列数超过 3,500,000,并且您必须添加 1,2,3,4,5,6,7,8 和 9 个字母的排列,这样您将有大约 4,000,000 个可能字。将每个单词与字典中的所有单词进行比较会非常缓慢。
  • 那你有什么建议?
【解决方案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)]

【讨论】:

    猜你喜欢
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多