关于列表和矩阵的基本python问题

我正在通过《如何像计算机科学家一样思考》这本书来学习PYTHON。有一个将矩阵m乘以标量n的特定练习:

选择 | 换行 | 行号
  1. def scalar_mult(n, m):
  2.  """
  3.     >>> a = [[1, 2], [3, 4]]
  4.     >>> scalar_mult(3, a)
  5.     [[3, 6], [9, 12]]
  6.     >>> b = [[3, 5, 7], [1, 1, 1], [0, 2, 0], [2,2, 3]]
  7.     >>> b
  8.     [[3, 5, 7], [1, 1, 1], [0, 2, 0], [2, 2, 3]]
  9.     >>> scalar_mult(10, b)
  10.     [[30, 50, 70], [10, 10, 10], [0, 20, 0], [20,20, 30]]
  11.     >>> b
  12.     [[3, 5, 7], [1, 1, 1], [0, 2, 0], [2, 2, 3]]
  13. """
  14.     new_matrix = []
  15.     for row in m:
  16.         new_row = []        
  17.         for value in row:
  18.             new_row += [value*n]
  19.         new_matrix += [new_row]
  20.     return new_matrix  
  21.  
  22.  

以上是正确的代码。
现在,谁能解释一下为什么我会:
>b[[3,5,7],[1,1,1],[0,2,0],[2,2,3]]
标量_MULT(10,b)
预期:
[[30,50,70],[10,10,10],[0,20,0],[20,20,30]]
得到:
[30,50,70,10,10,10,0,20,20,30],[30,50,70,10,10,10,0,20,30],[30,50,70,10,10,10,20,30],[30,50,70,10,20,30],[30,50,70,10,10,10,0,20,0,20,20,30]]
当代码编写如下时:

选择 | 换行 | 行号
  1. new_matrix = []
  2. new_row = [] 
  3.     for row in m:     
  4.         for value in row:
  5.             new_row += [value*n]
  6.         new_matrix += [new_row]
  7.     return new_matrix  
  8.  

当我将new_row=[]移到"for row in m:"上方时,究竟会发生什么情况?

# 回答1


您应该使用列表方法
追加()
而不是列表添加。这应该可以正常工作:

选择 | 换行 | 行号
  1. >>> b = [[3, 5, 7], [1, 1, 1], [0, 2, 0], [2, 2, 3]]
  2. >>> def f(n, m):
  3. ...     output = []
  4. ...     for row in m:
  5. ...         temp = []
  6. ...         for value in row:
  7. ...             temp.append(value*n)
  8. ...         output.append(temp)
  9. ...     return output
  10. ... 
  11. >>> f(10,b)
  12. [[30, 50, 70], [10, 10, 10], [0, 20, 0], [20, 20, 30]]
  13. >>> 

你也可以使用列表理解,这是我更喜欢的。

选择 | 换行 | 行号
  1. >>> b = [[3, 5, 7], [1, 1, 1], [0, 2, 0], [2, 2, 3]]
  2. >>> newb = [[item*10 for item in row] for row in b]
  3. >>> b
  4. [[3, 5, 7], [1, 1, 1], [0, 2, 0], [2, 2, 3]]
  5. >>> newb
  6. [[30, 50, 70], [10, 10, 10], [0, 20, 0], [20, 20, 30]]
  7. >>> 
# 回答2


"new_row"没有在for()循环中声明为空列表(置零),因此它仍然包含以前的所有值。在追加新值之后添加一条print语句以查看发生了什么(正如bvdet所说的,您应该使用append而不是'+')。
# 回答3


谢谢你的帮助,我现在明白了。Append方法还不在我的学习水平中,本书在以下章节中介绍了它,但这里发布了根据我的学习水平的解决方案,以防有人感兴趣:
Http://en.wikibooks.org/wiki/How_to_...Solutions/CH_9

选择 | 换行 | 行号
  1. new_matrix = []
  2.     for row in m:
  3.         new_row = []        
  4.         for value in row:
  5.             new_row += [value*n]
  6.         new_matrix += [new_row]
  7.     return new_matrix

标签: python

添加新评论