【问题标题】:multiply list of lists by list of lists列表列表乘以列表列表
【发布时间】:2014-11-18 19:42:48
【问题描述】:

有谁知道如何将列表列表乘以列表列表?

[[0], [0], [12, 8, 0]][[1], [10], [1, 100, 1]

预期结果[[0],[0], [12,800, 0]].

当我尝试时,我总是得到:

TypeError: 不能将序列乘以 'list 类型的非 int。

【问题讨论】:

    标签: python list multiplication nested-lists


    【解决方案1】:
    lst1 = [[0], [1,2]]
    lst2 = [[1], [2,2]]
    r = [a*b for x,y in zip(lst1,lst2) for a,b in zip(x,y)]
    
    print r
    

    输出:

    [0, 2, 4]
    

    在本例中,它之所以有效,是因为 lst1lst2 具有相同数量的子列表,它们也具有相同数量的整数项。

    【讨论】:

    • 是否可以保留列表列表的形式?在您的示例中获取输出: [[0],[2,4]] ??
    • 是:r = [[a*b for a,b in zip(x,y)] for x,y in zip(lst1,lst2)]
    【解决方案2】:

    另一种方式,

    >>> l1 = [[0], [0], [12, 8, 0]]
    >>> l2 = [[1], [10], [1, 100, 1]]
    >>> [ ix * l2[k1][k2] for k1, item in enumerate(l1) for k2,ix in enumerate(item) ]
    [0, 0, 12, 800, 0]
    

    【讨论】:

      【解决方案3】:

      列表推导很棒,但它们可能会让人感到困惑,尤其是对于自称是初学者的人。

      这种方式(几乎)等同于 Adem Oztas 的回答,除了保留了嵌套列表结构:

      def func(L1,L2):
          result=[]
          for xi,x in enumerate(L1):
              result.append([])
              for yi,y in enumerate(x):
                  result[xi].append(y*L2[xi][yi])
          return result
      
      print(func())
      

      列表理解版本是:

      [[y*L2[xi][yi] for yi,y in enumerate(x)] for xi,x in enumerate(L1) ]
      

      这保留了输入的嵌套列表结构:

      [[0],[0],[12,800,0]]
      

      相当于Apero的回答,即:

      [[a*b for a,b in zip(x,y)] for x,y in zip(lst1,lst2)]
      

      ...应该是这样的:

      def func(L1,L2):
          result=[]
          for x,y in zip(L1,L2):
              r = []
              result.append(r)
              for a,b in zip(x,y):        
                  r.append(a*b)
          return result
      
      print(func())
      

      这两个其他答案(使用列表推导)都比我上面使用循环所做的要好,因为这正是创建列表推导的目的。但是以另一种方式看到它可能有助于理解。

      【讨论】:

        【解决方案4】:
         List<List<Integer>> output = new ArrayList<List<Integer>>();
        
            for(int i = 0;i<lis1.size();i++){
                List<Integer> subOutPut = new ArrayList<Integer>();
                for(int j = 0;j<lis1.get(i).size();j++){
                    subOutPut.add(lis1.get(i).get(j)*lis2.get(i).get(j));
                }
                output.add(subOutPut);
            }
        

        在java中你可以如上实现

        输入:[[0], [0], [12, 8, 0]] * [[0], [0], [12, 8, 0]]

        输出:[[0], [0], [12, 800, 0]]

        【讨论】:

        • Pravin,感谢您的回复,但由于我是 Python 的初学者,我很难理解它,我不知道我可以在我的代码中使用哪个部分。字典的那些括号也需要吗?
        • 这不是 Python 代码。您需要用您感兴趣的语言标记您的问题。否则您将获得多种语言或伪代码的答案(这并不是一件坏事,只是取决于您想要什么)。
        猜你喜欢
        • 1970-01-01
        • 2021-07-30
        • 2021-07-30
        • 2014-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多