Мне нужно создать список кортежей, которые содержат состояние (SPACE
, WRITE
, SYMBOL
, et c) и токен (
, +
, [A-Za-z0-9]*
).
Мой ввод представляет собой строку токенов:
+ adfe3 + 212daeE
В настоящее время я использую этот оператор для преобразования моей входной строки в список кортежей, содержащих состояние и токен:
result = [(conversion_from_token_to_state(t),t) for t in stringOfTokens]
Что приводит к:
[('WRITE', '+'), ('SYMBOL', ' a '), (' SYMBOL ',' d '), (' SYMBOL ',' f '), (' SYMBOL ',' e '), (' SYMBOL ',' 3 '), (' SPACE ',' '), (' WRITE ',' + '), (' SYMBOL ',' 2 '), (' SYMBOL ',' 1 '), (' SYMBOL ',' 2 '), (' SYMBOL ',' d '), (' SYMBOL ',' a '), (' SYMBOL ',' e '), (' SYMBOL ',' E ')] *
Как можно уменьшить эти кратные последовательности ('SYMBOL', 'a')
кортежей в один ('SYMBOL', 'adfe3')
?
Полагаю, мне нужно добавить некоторую конструкцию if else
в мое понимание списка, но я не могу понять, как заставить его обрабатывать только символы / числа и не говоря уже о других.
Itertools.groupby , кажется, ответ, но я не понимаю, как это может быть применено таким образом, что только последовательные кортежи SYMBOL объединяются в один. * 103 3 *
Справочная информация для вопроса: это (состояния, токены перехода) в машине состояний, и поэтому вполне возможно, что только некоторые токены (в данном случае SYMBOL
) должны быть сгруппированы для перехода состояния, но несколько WRITE
или SPACE
могут возникать без необходимости группировки.