4

我正在尝试编写在 Python 中导入和导出复数列表的代码。到目前为止,我正在尝试使用 csv 模块。我已使用以下方法将数据导出到文件中:

spamWriter = csv.writer(open('data.csv', 'wb')
spamWriter.writerow(complex_data)

其中复数数据是由 complex(re,im) 函数生成的列表数字。前任:

print complex_data
[(37470-880j),(35093-791j),(33920-981j),(28579-789j),(48002-574j),(46607-2317j),(42353-1557j),(45166-2520j),(45594-232j),(41149+561j)]

要在以后导入它,我尝试以下操作:

mycsv = csv.reader(open('data.csv', 'rb'))
out = list(mycsv)
print out
[['(37470-880j)','(35093-791j)','(33920-981j)','(28579-789j)','(48002-574j)','(46607-2317j)','(42353-1557j)','(45166-2520j)','(45594-232j)','(41149+561j)']]

(请注意,这是一个列表列表,我只是碰巧只使用了一行作为示例。)

我现在需要把它变成复数而不是字符串。我认为应该有一种方法可以像在这个问题中那样使用映射来做到这一点,但我不知道如何让它发挥作用。任何帮助,将不胜感激!

或者,如果有任何更简单的方法可以导入/导出我不知道的复值数据,我很乐意完全尝试其他方法。

4

5 回答 5

9

只需将字符串传递给complex()

>>> complex('(37470-880j)')
(37470-880j)

就像int()它需要一个复数的字符串表示并解析它。您可以使用map()列表来执行此操作:

map(complex, row)
于 2012-07-25T22:00:57.813 回答
8
>>> c = ['(37470-880j)','(35093-791j)','(33920-981j)']
>>> map(complex, c)
[(37470-880j), (35093-791j), (33920-981j)]
于 2012-07-25T22:04:43.350 回答
1
complex_out = []
for row in out:
    comp_row = [complex(x) for x in row]
    complex_out.append(comp_row)
于 2012-07-25T22:01:34.147 回答
0

CSV 文档说:

请注意,复数是用括号括起来的。这可能会导致其他读取 CSV 文件的程序出现问题(假设它们完全支持复数)。

这应该将“out”中的元素从字符串类型转换为复数,这是给定现有代码且易于处理非复杂条目的最简单的解决方案。

 for i,row in enumerate(out):
      j,entry in enumerate(row):
          try:
               out[i][j] = complex(out[i][entry])
          except ValueError:
               # Print here if you want to know something bad happened
               pass

否则在每一行上使用 map(complex, row) 需要更少的行。

 for i,row in enumerate(out):
      out[i] = map(complex, row)
于 2012-07-25T22:03:22.307 回答
0

我认为上面的每种方法都有点复杂

最简单的方法是这个

In [1]: complex_num = '-2+3j'

In [2]: complex(complex_num)
Out[2]: (-2+3j)
于 2017-04-28T14:20:19.887 回答