2016-10-08 58 views
0

函数scoreList(Rack)获取一个字母列表。你也会得到一个全局变量字典:["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] ] 

我可以使用由列表解析(地图,过滤器,减少等)的表达,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]] 

在它们出现无关紧要的顺序。它也必须保持一个清单而不是一个词典。会喜欢这个问题的一些帮助,或者如果你能让我更好地理解如何在这个问题中使用地图或过滤器。

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

正如你可以看到我能找到的话,但没有得分。我怎么能不使用字典找到它?

+0

您示例答案中的数字是什么? –

+0

不幸的是,我想我可能会说我的问题不对。你输入你自己的字母,任何字母的列表。字典中可以用字母组成的任何单词都会与其分数一起输出。我忘了说它必须保持一个列表。很抱歉对于这个误会。 –

回答

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

谢谢你的帮助!无论如何不使用itertools并且不将分数制作成你知道的字典? –

+0

@VinceCarter为什么?当然,有些方法可以使用列表索引而不是字典,但我不会推荐它。你可以在native python中编写你自己的itertools或类似的代码,参见文档:https://docs.python.org/3.4/library/itertools.html#itertools.permutations –

+0

在所有的诚实中,这是作业。但是,我编辑了我的帖子,直到我陷入困境才能够获得。 –

相关问题