我正在尝试编写在Python中导入和导出复数列表的代码。到目前为止,我正在尝试使用csv模块。我使用以下方法将数据导出到文件中:
spamWriter = csv.writer(open('data.csv', 'wb')
spamWriter.writerow(complex_data)
复杂数据是复杂(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)']]
(请注意,这是一个列表列表,我恰好只使用了一行代表。)
我现在需要把它变成复数而不是字符串。我认为应该有一种方法可以使用this question中的映射来完成此操作,但我无法弄清楚如何使其工作。任何帮助将不胜感激!
或者,如果有任何更简单的方法来导入/导出我不知道的复数值数据,我会很乐意完全尝试其他的东西。
答案 0 :(得分:8)
只需将字符串传递给complex()
:
>>> complex('(37470-880j)')
(37470-880j)
与int()
类似,它需要一个复数的字符串表示并解析它。您可以使用map()
来获取列表:
map(complex, row)
答案 1 :(得分:7)
>>> c = ['(37470-880j)','(35093-791j)','(33920-981j)']
>>> map(complex, c)
[(37470-880j), (35093-791j), (33920-981j)]
答案 2 :(得分:1)
complex_out = []
for row in out:
comp_row = [complex(x) for x in row]
complex_out.append(comp_row)
答案 3 :(得分:0)
CSV文档说:
请注意,复数会被parens包围。这可能会导致其他读取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)
答案 4 :(得分:0)
我认为上述每种方法都有点复杂
最简单的方法就是这个
In [1]: complex_num = '-2+3j'
In [2]: complex(complex_num)
Out[2]: (-2+3j)