查找列表的所有组合

时间:2016-10-09 18:52:53

标签: python list

函数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] ]

我可以使用由列表推导(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):
result = [d for d in Dictionary if all(l in Rack for l in d)]
return result

我的输出:

 >>> scoreList(["a", "s", "m", "t", "p"])
    ['a', 'am', 'at', 'spam']

正如您所看到的,我已经找到了如何输出单词而不是分数。我还没有想出如何使用地图,过滤器或任何其他列表推导。

1 个答案:

答案 0 :(得分:0)

显然你反复提出同样的问题(根据你的问题评论)。所以我将尽可能彻底地回答这个问题

您似乎在名为Dictionary的列表中有一个拼字游戏字典。我将从那一点开始前进:

import itertools

def scoreList(rack):
    points = 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] ])

    validWords = set(Dictionary)
    answer = []
    for l in range(1, len(rack)):
        for word in itertools.permutations(rack, l):
            if not word in validWords: continue
            answer.append(word, sum(points[char] for char in word))
    return answer