写一个函数,接收两个由嵌套列表模拟成的矩阵,返回一个嵌套列表作为计算结果,要求运行效果如下:

>>> matrix1 = [[1, 1], [-3, 4]]
>>> matrix2 = [[2, -1], [0, -5]]
>>> add(matrix1, matrix2)
[[3, 0], [-3, -1]]
>>> matrix1 = [[1, -2, 3], [-4, 5, 6], [7, -8, 9]]
>>> matrix2 = [[1, 1, 0], [1, -2, 3], [-2, 2, -2]]
>>> add(matrix1, matrix2)
[[2, -1, 3], [-3, 3, 9], [5, -6, 7]]
最初思路是这样的:
嵌套循环遍历矩阵1的数据,通过index方法获得行索引和列索引(这里大错特错了),利用索引来取得矩阵2的相同位置的数据,再进行加法。
由于忽略了index方法只能找到第一个值的索引,导致当矩阵中有重复元素时,会一直用重复元素中的第一个进行计算。 正确的做法:
直接按照索引遍历,再用多个下标操作符去取得元素的值。
def add(matrix1, matrix2):
result = []
for row in range(len(matrix1)): # 行索引
row_result = []
for column in range(len(matrix1[row])): # 列索引
row_result.append(matrix1[row][column]+matrix2[row][column]) # 行结果
result.append(row_result) # 矩阵结果
return result

这样写,只能计算两个矩阵的加法,我们需要进一步扩展这个函数的功能,比如,让它可以计算任意多个矩阵的加法

只需要改成动态参数,每个位置的结果根据矩阵个数进行相应次数的计算。主体思路不变,仍然是以第一个矩阵的索引为准,取得其他矩阵对应位置的数据相加。

def add(*args):
result = []
num = len(args) # 获得矩阵个数,方便后面的计算
for row in range(len(args[0])):
row_result = []
for column in range(len(args[0][row])):
value_result = args[0][row][column] # 存储单个数据计算结果
for x in range(num - 1): # 进行(矩阵数-1)次加法
value_result += args[x + 1][row][column]
row_result.append(value_result)
result.append(row_result)
return result

这时,我们还想再完善一下这个函数,矩阵加法要求矩阵的行列数必须保持一致,我们就让它能够检测传入的矩阵的一致性,并抛出异常

ValueError:Given matrices are not the same size.

再进行计算之前,先检测合法性,遍历查看后续矩阵的行列数是否和第一个矩阵相同。

这里,使用filter以数据长度为条件进行筛选,若有被筛出去的数据,就说明矩阵大小不一致。

def add(*args):
result = []
num = len(args) # 获得矩阵个数,方便后面的计算
row_num = len(args[0])
column_num = len(args[0][0]) # 获得矩阵1的行列数,用于检测参与计算的矩阵的一致性 try: # 检测行数是否一致,若有被筛出去的矩阵,说明不一致
if len(list(filter(lambda r: len(r) == row_num, args))) != num:
raise ValueError('Given matrices are not the same size.')
for x in range(num): # # 检测列数是否一致,若有被筛出去的行,说明不一致
if len(list(filter(lambda r: len(r) == column_num, args[x]))) != row_num:
raise ValueError('Given matrices are not the same size.') for row in range(len(args[0])):
row_result = []
for column in range(len(args[0][row])):
value_result = args[0][row][column] # 存储单个数据计算结果
for x in range(num - 1): # 进行(矩阵数-1)次加法
value_result += args[x + 1][row][column]
row_result.append(value_result)
result.append(row_result)
return result except ValueError:
raise

python 用嵌套列表做矩阵加法的更多相关文章

  1. PYTHON压平嵌套列表

    list 是 Python 中使用最频繁的数据类型, 标准库里面有丰富的函数可以使用.不过,如果把多维列表转换成一维列表(不知道这种需求多不多),还真不容易找到好用的函数,要知道Ruby.Mathem ...

  2. python:字典嵌套列表

    Python的字典{ }以键值对的形式保存数据,可以以键来访问字典中保存的值而不能用下标访问.字典中几乎可以包含任意的变量,字典,数列,元组.数列也一样. python的列表[ ]与字典不同,列表通过 ...

  3. python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解

    推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...

  4. python嵌套列表知多少

    今天在创建嵌套列表时遇到一个问题,决定看看到底是谁在背后捣鬼 >>> board1 = [[0]*3 for _ in range(3)] [[0, 0, 0], [0, 0, 0] ...

  5. python 字典和列表嵌套用法

    python中字典和列表的使用,在数据处理中应该是最常用的,这两个熟练后基本可以应付大部分场景了.不过网上的基础教程只告诉你列表.字典是什么,如何使用,很少做组合说明. 刚好工作中采集promethe ...

  6. Python中关于列表嵌套列表的处理

    在处理列表的时候我们经常会遇到列表中嵌套列表的结构,如果我们要把所有元素放入一个新列表,或者要计算所有元素的个数的话应该怎么做呢? 第一个例子 对于上图中的这样一组数据,如果我们要知道这个CSV文件中 ...

  7. 【python】Leetcode每日一题-扁平化嵌套列表迭代器

    [python]Leetcode每日一题-扁平化嵌套列表迭代器 [题目描述] 给你一个嵌套的整型列表.请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的每一项或者为一个整数,或者是另 ...

  8. Python代码阅读(第11篇):展开嵌套列表

    Python 代码阅读合集介绍:为什么不推荐Python初学者直接看项目源码 本篇阅读的代码实现了展开嵌套列表的功能,将一个嵌套的list展开成一个一维list(不改变原有列表的顺序). 本篇阅读的代 ...

  9. Python 打印嵌套list中每个数据(遍历列表)

    new_list = ["H1","H2",1999] for each_list in new_list: print (each_list); 若列表中包含 ...

随机推荐

  1. Web后端 JAVA实现验证码生成与验证功能

    首先,写一个验证码生成帮助类,用来绘制随机字母: <span style="font-size:14px;">import java.awt.Color;  impor ...

  2. H5、C3、ES6的新特性

    H5的新特性 1.语义化标签 有利于SEO,有助于爬虫抓取更多的有效信息,爬虫是依赖于标签来确定上下文和各个关键字的权重. 语义化的HTML在没有CSS的情况下也能呈现较好的内容结构与代码结构 方便其 ...

  3. js当地天气调用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Hacking Bsides Vancouver 2018 walkthrough

    概述: Name: BSides Vancouver: 2018 (Workshop) Date release: 21 Mar 2018 Author: abatchy Series: BSides ...

  5. C# 中一些类关系的判定方法

    1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

  6. 可达用户投资额的计算(Java)

    有话要说: 前阵子遇到了一个计算可达用户投资额的问题,觉得非常有趣,故把它记录下来. 问题描述: 某产品可被投资,注册后才可以投资,其注册可以被邀请(并不是每个人都是被邀请的).邀请人可以邀请多个人注 ...

  7. 浅谈AndroidGPU过度绘制、GPU呈现模式分析及相关优化

    在真机设备下有一个开发者选项,这个大家都知道,我们最常用的就打开'USB调试'功能,方便真机调试. 在这开发者选项中还有个选项,'调试GPU过度绘制' 这里选择第二个选项'显示过度绘制区域' 可以看到 ...

  8. Android 报错:error: too many padding sections on bottom border

    一.发生错误 [我以为我做了一张完美的.9图片,没想到.9图片还需要画左边和上边,尴尬···] 二.解决方法 .9图片造成错误 [具体内容] 最后修改.9图为

  9. mysql的严格模式与无效字符编码问题

    问题一般格式为: 1366 Incorrect string value: '' for column 1300 Invalid utf8 character string: '' 向mysql插入中 ...

  10. 重庆3Shape CAMbridge都有哪些功能

    三维打印技术创新领导者Objet Geometries公司和牙科领域三维扫描仪.CAD/CAM软件解决方案供应商3Shape A/S公司日前宣布两家公司合作研发的牙科领域三维修复解决方案已付诸实施.此 ...