【问题标题】:Multiply a list of lists by a list将列表列表乘以列表
【发布时间】:2014-11-11 00:02:26
【问题描述】:

我想将一个列表列表(例如 ([2,3,6],[3,4,9],[4,8,13]) )乘以另一个列表,该列表也将具有相同数量的列表作为第一组列表,即第一个列表可能有 3 个列表,每个列表包含 5 个数字,但第二个列表将有 3 个数字,每个数字乘以第一个列表的行的元素。例如

([2,3,6],[3,4,9],[4,8,13]) with [2,3,4]

会导致

([4,6,12],[9,12,27],[16,32,52])

到目前为止我有

sol = [inv[i]*bb[i] for i in range(len(inv[i]))]
        return sol

inv[i] 是我的列表,bb 是我的列表。

我想要这个,以便它可以用于 bb 和 inv[i] 中任何长度的列表,只要它们的长度相同

谢谢大家

更新:

我添加了磅的解决方案并摆弄了一下

现在打印出来了

[20.0, -9.0, -3.0]
[40.0, -18.0, -6.0]
[40.0, -18.0, -6.0]
[40.0, -18.0, -6.0]
[3.0, -2.0, -0.0]
[40.0, -18.0, -6.0]
[40.0, -18.0, -6.0]
[40.0, -18.0, -6.0]
[-8.0, 4.0, 1.0]
[40.0, -18.0, -6.0]
[40.0, -18.0, -6.0]
[40.0, -18.0, -6.0]

对于此代码:

print (inv[i])

       sol = []
       for i, item in enumerate(inv):
           sol.append(map(lambda x: x*bb[i], item))

           print sol[i]

我如何摆脱这些废话,只保留最后 3 行?

【问题讨论】:

  • 您是否尝试取消缩进print sol[i],并将其替换为:print sol(省略[i])?

标签: list python-2.7 multiplication


【解决方案1】:
big = [[2,3,6],[3,4,9],[4,8,13]]
small = [2,3,4]

res = []

for i, item in enumerate(big):
    res.append(map(lambda x: x*small[i], item))

print res

输出:

[[4, 6, 12], [9, 12, 27], [16, 32, 52]]

【讨论】:

  • sol.append(map(lambda x: x*bb[i], item)) TypeError: argument 2 to map() must support iteration 是我得到的 - 列表的输入是没有定义的。它可以是 shell 中的任何随机值 inout。我已经把它变成了一个 def 函数
  • for i in xrange(len(inv)): print (inv[i]) inverse = inv[i] sol = [] for i, item in enumerate(inverse): sol.append( map(lambda x: x*bb[i], item)) print sol i 改变大小以匹配我的变量.. 顶部是在我完成一些计算之后
  • 你能编辑你的答案并格式化代码吗?我无法阅读您的评论。
  • 更新:我已经设法让它正确打印它,但它会事先打印出一堆不必要的东西......我会在问题中发布它
【解决方案2】:
import itertools

L = [[2,3,6],[3,4,9],[4,8,13]]
M = [2,3,4]
[[i*j for i,j in zip(subl, subm)] for subl, subm in zip(L, itertools.cycle([M]))]

输出:

Out[101]: [[4, 9, 24], [6, 12, 36], [8, 24, 52]]

没有迭代工具:

answer = []
for subl in L:
    temp = []
    for i in range(len(subl)):
        temp.append(subl[i] * M[i])
    answer.append(temp)

输出:

In [103]: answer
Out[103]: [[4, 9, 24], [6, 12, 36], [8, 24, 52]]

【讨论】:

    【解决方案3】:

    使用 numpy 库:

    import numpy as np
    list1 = np.array([[2,3,6],[3,4,9],[4,8,13]])
    list2 = np.array([2,3,4])
    result = list1 * list2.transpose()
    result_list = result.tolist()
    

    或者没有 numpy:

    list1 = [[2,3,6],[3,4,9],[4,8,13]]
    list2 = [2,3,4]
    result_list = list1[:]
    for i in range(len(list1)):
        result_list[i] = [x * list2[i] for x in result_list[i]]
    

    【讨论】:

    • 很好,但是“对不起,如果可能的话,我想尝试在没有任何导入的情况下这样做......” - OP
    • 为什么要寻找困难的解决方案? Numpy 非常好用,而且 Numpy 库是用 C 实现的,速度非常快,而 Python 循环非常慢。只需比较较大列表的性能;)
    • 大声笑。一旦你使用了 numpy,我猜你永远不会回去...... ;)
    • @Pound,是的,除非它与 Python 循环结合使用
    猜你喜欢
    • 2021-07-30
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 2020-07-28
    相关资源
    最近更新 更多