2015-05-12 1 views
0

У меня есть текстовый файл комплексных чисел, называемых output.txt в виде:Хочет, чтобы преобразовать текстовый файл комплексных чисел в список чисел в Python

[-3.74483279909056 + 2.54872970226369*I] 
[-3.64042002652517 + 0.733996349939531*I] 
[-3.50037473491252 + 2.83784532111642*I] 
[-3.80592861109028 + 3.50296053533826*I] 
[-4.90750592116062 + 1.24920836601026*I] 
[-3.82560512449716 + 1.34414866823615*I] 
etc... 

Я хочу, чтобы создать список из них (читать как строка в Python) комплексных чисел.

Вот мой код:

data = [line.strip() for line in open("output.txt", 'r')] 
for i in data: 
    m = map(complex,i) 

Однако я получаю сообщение об ошибке:

ValueError: complex() arg is a malformed string 

Любая помощь приветствуется.

ответ

2

Из справочной информации, для complex встроена функции:

>>> help(complex) 
class complex(object) 
| complex(real[, imag]) -> complex number 
| 
| Create a complex number from a real part and an optional imaginary part. 
| This is equivalent to (real + imag*1j) where imag defaults to 0. 

Так что вам нужно форматировать строку правильно, и передать действительные и мнимые части в виде отдельных аргументов.


Пример:

num = "[-3.74483279909056 + 2.54872970226369*I]".translate(None, '[]*I').split(None, 1) 
real, im = num 
print real, im 
>>> -3.74483279909056 + 2.54872970226369 
im = im.replace(" ", "") # remove whitespace 
c = complex(float(real), float(im)) 
print c 
>>> (-3.74483279909+2.54872970226j) 
+0

Спасибо за вашу помощь, однако, я получаю новую ошибку: ValueError: не удалось преобразовать строку float: [-3.74483279909056 почему он не мог этого сделать? – AIREL

+1

@AIREL У вас не может быть открывающего кронштейна '[' для этого числа. Вы уверены, что используете '.translate (None, '[] * I')', который удаляет символы '[] * I'? – jaynp

+0

Вы правы, извините. Теперь мне просто нужно преодолеть препятствия комплексных чисел, имеющих как Re + Im, так и Re -Im. .split не поймет, функция или будет ли это ... – AIREL

0

Попробуйте это:

numbers = [] 
with open("output.txt", 'r') as data: 
    for line in data.splitlines(): 
     parts = line.split('+') 
     real, imag = tuple(parts[0].strip(' ['), parts[1].strip(' *I]')) 
     numbers.append(complex(float(real), float(imag))) 

Проблема с оригинальным подходом является то, что ваш входной файл содержит строки текста, комплекс() не знает, как обработать. Сначала нам нужно сломать каждую строку до пары чисел - реального и воображаемого. Для этого нам нужно немного манипулировать строками (split и strip). Наконец, мы преобразуем строки real и imag в float, когда мы передаем их в функцию complex().

0

Вот краткий способ для создания списка комплексных значений (на основе dal102 ответа):

data = [complex(*map(float,line.translate(None, ' []*I').split('+'))) for line in open("output.txt")]