Попытка преобразовать строку в список комплексных чисел - PullRequest
1 голос
/ 17 июня 2020

Я пытаюсь преобразовать строку в список комплексных чисел. (Если бы вы читали его без кавычек, это был бы список комплексных чисел.) Я написал функцию для этого, но получаю следующую ошибку:

Traceback (most recent call last):
    File "complex.py", line 26, in <module>
        print(listCmplx('[1.111 + 2.222j, 3.333 + 4.444j]'))
    File "complex.py", line 10, in listCmplx
        while (not isDigit(listIn[count])) and (listIn[count] != '.'):
IndexError: string index out of range

Что я? здесь делаете что-то не так?

def isDigit(char):
    return char in '0123456789'

def listCmplx(listIn):
    listOut = []
    count = 0
    real = '0'
    imag = '0'
    while count < len(listIn):
        while (not isDigit(listIn[count])) and (listIn[count] != '.'):
            count += 1
        start = count
        while (isDigit(listIn[count])) or (listIn[count] == '.'):
            count += 1
        end = count
        if listIn[count] == 'j':
            imag = listIn[start:end]
        else:
            real = listIn[start:end]
        if listIn[count] == ',':
            listOut += [float(real) + float(imag) * 1j]
            real = '0'
            imag = '0'
    return listOut

print(listCmplx('[1.111 + 2.222j, 3.333 + 4.444j]'))

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 17 июня 2020

Удивительно, но Python может делать это без необходимости написания каких-либо функций, благодаря встроенному классу комплексных чисел.

listIn = '1.111 + 2.222j, 3.333 + 4.444j'
listOut =  eval(listIn)

print(listOut[0])
print(listOut[0].imag,listOut[0].real)
1 голос
/ 17 июня 2020

Ваша исходная задача синтаксического анализа является хорошим примером, поскольку она подчеркивает важность, когда это возможно, использования простейших доступных инструментов синтаксического анализа самого высокого уровня. Простые высокоуровневые инструменты включают базовые c вещи, такие как разделение, удаление и индексирование строк. Regex можно рассматривать как инструмент среднего уровня, и он, безусловно, более сложный. Самым низкоуровневым инструментом - и тем, что вы выбрали - был анализ персонажей. Никогда не делайте этого, если только вы совершенно не вынуждены делать это из-за данной проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...