Logan Tischler
Logan Tischler

Reputation: 115

Trying to convert a string to a list of complex numbers

I am trying to convert a string to a list of complex numbers. (If you were to read it without quotes, it would be a list of complex numbers.) I've written a function to do this, but I'm getting this error:

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

What am I doing wrong here?

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]'))

Thank you in advance.

Upvotes: 1

Views: 531

Answers (2)

FMc
FMc

Reputation: 42421

Your original parsing problem is a good example because it highlights the importance, whenever possible, of using the simplest, highest-level parsing tools available. Simple, high-level tools include basic things like splitting, stripping, and string indexing. Regex might be considered a mid-level tool, and it's certainly a more complex one. The lowest-level tool -- and the one you chose -- was character by character analysis. Never do that unless you are absolutely forced to by the problem at hand.

Here's one way to parse your example input with simple tools:

# Helper function to take a string a return a complex number.
def s2complex(s):
    r, _, i = s.split()
    return complex(float(r), float(i[:-1]))

# Parse the input.
raw = '[1.111 + 2.222j, 3.333 + 4.444j]'
xs = raw[1:-1].split(', ')
nums = [s2complex(x) for x in xs]

# Check.
for n in nums:
    print(n)

Upvotes: 1

JimmyCarlos
JimmyCarlos

Reputation: 1952

Amazingly, this is something Python can do without needing any functions written, with its inbuilt complex number class.

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

print(listOut[0])
print(listOut[0].imag,listOut[0].real)

Upvotes: 2

Related Questions