检索作为列表中的字符串存储的复数的实部和虚部

时间:2018-01-22 09:59:58

标签: python python-3.x complex-numbers

我这样做是为了恢复字符串的第一部分,例如:" 13" " 13 + i":

l1 = ['13+i', '1+4i', '3+2i', '11+4i', '5+i', '10+2i', '5+4i']
l2 = [i.split('+')[0] for i in l1]
l2 = list(map(int, l2))

效果很好,然后我想要" 1"来自" 13 + i"但是自从" i"在字符串中没有" 1"因素。

我应该得到:

[1, 4, 2, 4, 1, 2, 4]

,即只有数组中复数的虚部。

有什么想法可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:5)

Python有一种处理复数的方法;它实际上有一个类型(<class 'complex'>)。因此,为了避免重新发明轮子,我强烈建议使用它。

为此,我们必须首先清理我们的输入(将值从strings转换为complex)。要做到这一点,我们必须首先遵守使用'j'虚构单元的Python惯例,而不是'i'

l1 = ['13+i', '1+4i', '3+2i', '11+4i', '5+i', '10+2i', '5+4i']
l1 = [complex(x.replace('i', 'j')) for x in l1]

# if you are curious how they look like
print(l1)
# -> [(13+1j), (1+4j), ...]

现在值正确,我们可以利用complex类型的.real and .imag attributes变量,并使用list-compehensions构建我们的结果列表。

real_parts = [value.real for value in l1]
print(real_parts) 
# -> [13.0, 1.0, 3.0, 11.0, 5.0, 10.0, 5.0]

imaginary_parts = [value.imag for value in l1]
print(imaginary_parts)
# -> [1.0, 4.0, 2.0, 4.0, 1.0, 2.0, 4.0]

请注意,默认情况下,它们都是实数(实际上是非整数)。使用int可以很容易地将它们转换为[int(value.real) for value in l1]

使用现有功能可能最好的事情是,不必担心有关您可能没有的边缘情况,因此可能导致代码中断。例如4j(没有实际部分)或1-j(负虚部因此.split('+')[0]不起作用)等等。

答案 1 :(得分:0)

python complex类型使用j而不是i来表示复数。

因此,

i=['13+i','1+4i','3+2i','11+4i','5+i','10+2i','5+4i']
real_parts=[ complex(x.replace("i", "j")).real for x in i]
imaginary_parts=[ complex(x.replace("i", "j")).imag for x in i ]

将是您正在寻找的。