我这样做是为了恢复字符串的第一部分,例如:" 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]
,即只有数组中复数的虚部。
有什么想法可以帮我解决这个问题吗?
答案 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 ]
将是您正在寻找的。 p>