ifullut
@ifullut
Учу программирование понарошку...

Как узнать, что ключ словаря это любая буква в Python?

Всем привет. У меня есть словарь, пускай назовем Tokens. В нем содержится следующее:
Tokens = {
    'var':'VARIABLE',
    '==':'EQUAL',
}


И так в русском и английском алфавите 33 и 28 букв (если не ошибает память) суммарно их 61 и это только маленькие + больших 61 не писать же в словаре 122 раза? Плюс цифры до бесконечности отрицательные и положительные, это точно не возможно. Можно ли это как упростить?
Чтоб было:

Tokens = {
    'var':'VARIABLE',
    '==':'EQUAL',
    'letters':'LETTER',
    'ints':'INT'
}


#обновлено
Чуть побольше инфы. Я делаю лексер. У меня есть такой код:
KEYWORDS = { #tokens
'var':'VARIABLE',
'=':'RESERVED',
'==':'EQUAL',
'>':'GT',
'<':"LT",
'(':'LPARENT',
')':'RPARENT',
'()':'PARENTS',
'class':"main_word",
'func':'main_word',
}
LINE = input("> ") #shell
 
def lex(LINE,KEYWORDS): #функция
    ret = []
    lines = LINE.split()
    for line in lines:
        if line in KEYWORDS:
            ret.append((line, KEYWORDS[line]))
        else:
            ret.append((line, '?')) #если неизвестен токен, изменяем его на '?'
    return ret
 
# Мне надо получить
tokens = lex(LINE,KEYWORDS)
print(tokens)
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Коротко говоря, задача слишком развесистая, чтобы "в лоб" решить ее тем способом, который ты выбрал.
Там, к примеру, возникает вопрос об отличии между LETTER и STRING - если ты понимаешь, о чем я. Если решать тем способом, который выбрал ты - это будет изрядное костылетворчество.
Кроме того, у тебя не рассматриваются варианты, когда в STRING присутствуют знаки, пробельные символы и т.п.

Но, в общем, с некоторыми допущениями (без различения LETTER и STRING) и с учетом исправления некоторых твоих опечаток и ошибок, я слегка приблизился к твоему заданию:
код
import unittest
import string


def make_answer(arg):  # собирает строку, как в ответах
    result = None
    for element in arg:
        subresult = ' '.join(element)
        if not result:
            result = subresult
        else:
            result = result + ', ' + subresult
    result += '.'
    return result


def lex(line, keywords):  # функция
    ret = []
    lines = line.split()
    for number, line in enumerate(lines):
        if line in keywords:
            ret.append((line, keywords[line]))
        elif line in string.digits:  # если цифры
            ret.append((line, 'INT'))
        elif line.strip().isalpha():  # если буквы
            ret.append((line, 'LETTER'))
        else:
            ret.append((line, '?'))  # если неизвестен кейворд
    return ret


class TestStringMethods(unittest.TestCase):  # Это тестирование функции let()

    def test_lex(self):
        """
        подает на вход функции строки - ключи словаря true_results,
        сравнивает результат со строками - значениями этого словаря
        """
        true_results = {'var one = 123': 'var VARIABLE, one LETTER, = ZNAK, 123 INT.',
                        'var hi = Hello world': 'var VARIABLE, hi LETTER, = ZNAK, Hello LETTER, world LETTER.',
                        'func Main ()': 'func MAIN WORD, Main LETTER, () PARENTS.'}
        for key in true_results.keys():
            self.assertEqual(make_answer(lex(line=key, keywords=KEYWORDS)), true_results[key])


if __name__ == '__main__':
    KEYWORDS = {
        'var': 'VARIABLE',
        '=': 'ZNAK',
        '==': 'EQUAL',
        '>': 'GT',
        '<': "LT",
        '(': 'LPARENT',
        ')': 'RPARENT',
        '()': 'PARENTS',
        'class': "MAIN WORD",
        'func': 'MAIN WORD'
    }
    unittest.main()  # запускает тест

Это не решение задачи, которую ты перед собой поставил, но это пример, как можно было бы решить некоторую часть вопросов, которые возникают. Не надо брать это за основу, но можно покопаться.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы