2016-10-08 2 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] ] 

можно использовать выражение, составленное из списковых (карты, фильтр, уменьшить и т.д.), если заявления, и петлю, но только если они находятся в контексте списка понимание.

Пример:

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

Как вы можете видеть, что я был в состоянии найти слова, но не счет. Как я мог найти его без использования dict?

+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 Почему? Конечно, есть способы, вы можете использовать индексирование списка вместо словаря, но я бы не рекомендовал его. Вы можете написать свой собственный itertools или аналогичный в родном python, см. Документацию: https://docs.python.org/3.4/library/itertools.html#itertools.permutations –

+0

Честно говоря, это домашнее задание. Тем не менее, я отредактировал свой пост на то, что смог получить, пока не застрял. –

Смежные вопросы