代码之家  ›  专栏  ›  技术社区  ›  GabrielT

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

  •  4
  • GabrielT  · 技术社区  · 7 年前

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

    i、 例如,数组中只有复数的虚部。

    有什么办法帮我解决这个问题吗?

    2 回复  |  直到 7 年前
        1
  •  7
  •   Ma0    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 and .imag 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 (负虚部so .split('+')[0] 不会工作)等等。

        2
  •  0
  •   JRasmusBm    7 年前

    python复杂类型使用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 ]
    

    就是你要找的。