【问题标题】:Math operations between values in list and list of lists (python3)列表中的值和列表列表之间的数学运算(python3)
【发布时间】:2017-03-01 10:22:59
【问题描述】:

我被困在一个看似简单的问题上:

我有 2 个列表,让我们说:

a = [[1], [2]]
b = [[1, 2, 3], [4, 5, 6]]

我想要这个结果:

result = [[2, 3, 4], [6, 7, 8]]

通过添加(或者,为什么不减去)a[0] 值到 b[0] 的每个值,然后 a[1] 到 b[1] 等... 我试过使用 zip 没有预期的结果:

result = [x for x in zip(a, b)]

有人可以帮助我进步吗?

【问题讨论】:

    标签: list python-3.x list-comprehension


    【解决方案1】:

    您有一个包含 1 个元素的列表列表,并且您希望将该元素添加到另一个列表的所有元素上。由于预期结果是一个列表列表,因此您必须创建一个双重列表推导,如下所示:

    a = [[1], [2]]
    b = [[1, 2, 3], [4, 5, 6]]
    
    result = [[x+v for x in l] for [v],l in zip(a,b)]
    
    print(result)
    

    结果:

    [[2, 3, 4], [6, 7, 8]]
    

    for [v],l 是一种在列表中解包元素的简洁方法,因此它避免了循环中的x+v[0],并且它的性能更高(和pythonic)。另外:如果列表突然包含超过 1 个元素,您将收到解包错误而不是意外结果(通过忽略更多元素)。

    【讨论】:

    • 是的!对我有用,谢谢:-)这就是我正在寻找的方式。到目前为止,我从未做过双重列表理解......
    【解决方案2】:

    你可以使用 numpy 来做到这一点,它天生就支持这样的数组操作:

    >>> import numpy as np
    >>> i = np.array([[1], [2]])
    >>> j = np.array([[1, 2, 3], [4, 5, 6]])
    >>> i+j
    array([[2, 3, 4],
           [6, 7, 8]])
    

    如果您的列表很大,这可能比列表推导具有速度优势,因为 numpy 使用快速的低级例程来处理此类内容。

    如果没有,并且您还没有安装 numpy,那么安装另一个库的开销可能不值得。

    【讨论】:

    • 谢谢,我会记住你的解决方案,以防我以后使用 numpy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 2017-01-02
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多