如何在Python中将字符串列表转换为复数?

4

我正在尝试编写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)']]

(请注意,这是一个列表的列表,我只是为了示例而使用了一行。)
我现在需要将此转换为复数而不是字符串。我认为应该有一种通过映射来实现这一点的方法,就像这个问题中所述,但我无法弄清楚如何使其工作。如果有任何帮助,将不胜感激!
或者,如果有任何更容易导入/导出复数值数据的方法,而我不知道,请告诉我,我很乐意尝试其他方法。
5个回答

9

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

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

就像使用int()函数一样,它接受一个复数的字符串表示形式并解析它。您可以使用map()函数来处理列表中的数据:

map(complex, row)

8
>>> c = ['(37470-880j)','(35093-791j)','(33920-981j)']
>>> map(complex, c)
[(37470-880j), (35093-791j), (33920-981j)]

@Martijn Pieters比你快了3分钟,但还是+1。 - inspectorG4dget
这在Python 3中不起作用。Map已被(大多数)弃用:https://dev59.com/U1kS5IYBdhLWcg3wVlXC - Max

1
complex_out = []
for row in out:
    comp_row = [complex(x) for x in row]
    complex_out.append(comp_row)

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)

0

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

最简单的方法是这样的

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

In [2]: complex(complex_num)
Out[2]: (-2+3j)

... 这正是最受赞同的观点所说的,除了它不必将其不必要地包装成一个Jupyter笔记本。 - logicOnAbstractions

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接