Преобразовать список строк в правильный тип - PullRequest
1 голос
/ 11 ноября 2019

Я пытаюсь преобразовать токенизированный список строк в список подходящих типов. Эта функция, typeChange, вызывается для того, чтобы возвратить правильно напечатанную версию строки.

Мой код до сих пор выполняет все следующие действия, кроме последнего случая. Есть ли простой способ исправить эту проблему?

Например:

"1" -> 1
"True" -> True
"\str" -> "\str"
"[1 2 3 4 5]" -> [1,2,3,4,5]
"[1 2 3 4 5 x]" -> [1,2,3,4,5,"x"]

Это функция typeChange для моего упрощенного интерпретатора PostScript.

def typeChange(c):
    try:
        if '[' in c:    # checking if it is a list, for some reason can't do or ']', because ints return as a list
            retList = list(map(int, (c.strip('][').split(' '))))
            return (len(retList), retList)
        if c=='True':
            return True
        elif c=='False':
            return False
        return int(c)
    except:
        return c

Мой ожидаемыйвсе результаты работают для всех предоставленных случаев, кроме случаев, когда строка / переменная находится внутри списка:

Ожидается: '[1 x 2 3 4]' -> [1,"x",2,3,4]
Факт: '[1 x 2 3 4]' -> '[1 x 2 3 4]'

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Поскольку выходная строка '[1 x 2 3 4]' совпадает с входной строкой, это означает, что строка return c в блоке except запускается, поэтому что-то в блоке try вызывает ошибку.

Ошибка в строке retList = list(map(int, (c.strip('][').split(' ')))), вызванная выполнением map(int, ...) в списке значений, которые не являются всеми числовыми строками;одна из них - строка 'x'. int('x') выдает ValueError, отсюда и наблюдаемое поведение.

Чтобы это исправить, замените map(int, ...) на map(typeChange, ...), чтобы рекурсивно отобразить числовые строки в целые, оставляя нечисловые строки (как 'x') как строки без сообщения об ошибке.

0 голосов
/ 11 ноября 2019
def typeChange(c):
    try:
        if '[' in c:    # checking if it is a list, for some reason can't do or ']', because ints return as a list
            retList = [int(x) if x.isdigit() else str(x) for x in c.strip('[]').split(' ')]
            return retList
        if c=='True':
            return True
        elif c=='False':
            return False
        return int(c)
    except:
        return c

typeChange('[1 2 3 4 5 x]')
[1, 2, 3, 4, 5, 'x']

Итак, давайте посмотрим тип:

type(typeChange('[1 2 3 4 5 x]'))
list

Мы использовали str.isdigit() для возврата логического значения, если строка представляет число:

'x'.isdigit()
False
'1'.isdigit()
True
...