我这样做是为了恢复字符串的第一部分,例如:“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] 不起作用)等等。

10-08 14:27