我这样做是为了恢复字符串的第一部分,例如:“13+i”的“13”:
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))
它运行良好,然后我想要“13+i”中的“1”,但自从字符串中的“i”没有“1”因子以来,它变得更加复杂。
我应该得到:
[1, 4, 2, 4, 1, 2, 4]
即,只有数组中复数的虚部。
有什么想法可以帮助我解决这个问题吗?
最佳答案
Python 有一种处理复数的方法;它实际上有一个类型( <class 'complex'>
)。因此,为了避免重新发明轮子,我强烈建议使用它。
为此,我们必须首先清理我们的输入(将值从 strings
转换为 complex
)。为此,我们必须首先遵守 Python 对使用 'j'
而不是 '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), ...]
现在有了正确格式的值,我们可以利用 .real
类型变量的 .imag
and complex
attributes 并使用列表解析构建我们的结果列表。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]
不起作用)等等。