Понимание списка Python не работает правильно - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу написать метод, который будет возвращать слово из файла на основе переданного аргумента. Но если нет слов, подходящих под аргумент, я не хочу ничего возвращать. Так что в моем файле самое высокое слово имеет 97 баллов. Но если я пройду оценку 98, появится ошибка об индексе. У меня есть что-то вроде этого:

main.py

from option import Option
import argparse

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()

group.add_argument( "--score", "-s", help="Find word for given score", type=int)

option = Option()
if args.score:
    option.word_from_score(args.score)

option.py

import random
class Option():
    def __init__(self):
        self.file = [line.rstrip('\n').upper() for line in open('dictionary.txt', "r")] 

    SCRABBLES_SCORES = [(1, "E A O I N R T L S U"), (2, "D G"), (3, "B C M P"),
                (4, "F H V W Y"), (5, "K"), (8, "J X"), (10, "Q Z"), (11, "Ą Ć Ę Ł Ń Ó Ś Ź Ż")]
    global LETTER_SCORES 
    LETTER_SCORES = {letter: score for score, letters in SCRABBLES_SCORES
             for letter in letters.split()}

    def word_from_score(self,score):
        print(random.choices([word for word in self.file if sum([LETTER_SCORES[letter] for letter in word ]) == score]))

И этот метод возвращает слово, но не обрабатывает ошибку. Итак, я попробовал это:

def word_from_score(self,score):
    print(random.choices([(word if sum([LETTER_SCORES[letter] for letter in word ]) == score else "") for word in self.file]))

Но в этом случае он возвращает "" для каждого аргумента, который я передаю. Где ошибка в этом методе?

[EDIT] Например, я запускаю свою программу из командной строки и:

python main.py -f

возвращает 97, потому что это оценка для некоторых слов в файле. Итак, если я запустил другой метод:

pythom main.py -s 97

Которые возвращают слово из файла с таким количеством очков. И это работает. Но если я возьму 98 в качестве аргумента, это не сработает, потому что в файле нет слова с таким счетом. И теперь я хочу разобраться с этим делом, чтобы вернуть ""

1 Ответ

0 голосов
/ 12 ноября 2018

В настоящее время сжатие списка создает список слов, которые соответствуют оценке, но также включают пустые строки для любых слов, которые не соответствуют оценке. Вы хотите что-то вроде этого:

def word_from_score(self,score):
    valid_words = [word for word in self.file if sum([LETTER_SCORES[letter] for letter in word ]) == score]
    if len(valid_words) != 0:
        print(random.choices(valid_words))
    else:
        print('')
...