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

>>> 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. IO流简要总结

    IO流小总结 IO流的本质就是用于数据的传输,根据流的方向的不同,有输入流.输出流.根据数据类型的不同,又有字节流.字符流. 字节流 字节输入流   InputStream 字节输出流   Outpu ...

  2. Java并发——synchronized关键字

    前言: 只要涉及到Java并发那么我们就会考虑线程安全,实际上能够实现线程安全的方法很多,今天先介绍一下synchronized关键字,主要从使用,原理介绍 一.synchronized的使用方法 1 ...

  3. 日志分析工具Log Parser介绍

    摘要: 微软动态CRM专家罗勇 ,回复321或者20190322可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 分析Dynamics 365 Customer Enga ...

  4. 服务器四:多进程epoll

    #include <fcntl.h> #include <sys/socket.h> #include <netinet/in.h> #include <ar ...

  5. 关于boostrap的modal隐藏问题(前端框架)

    Modal(模态框) 首先,外引boostrap和Jquery的文件环境: <link rel="stylesheet" href="https://cdn.sta ...

  6. 利用Navicat高效率postgresql转mysql数据库

    本人很喜欢postgresql数据库,也一直认为postgresql比mysql要更好更强大. 可生态环境太差了,无奈,最近要把一个小站转成mysql数据库. 小站主要表数据110万,pg_dump备 ...

  7. ubuntu18.04修改网卡名称为eth0

    1.修改grub文件 vim /etc/default/grub 查找 GRUB_CMDLINE_LINUX="" 修改为 GRUB_CMDLINE_LINUX="net ...

  8. 订制rpm包到Centos7镜像中

    本文以CentOS 7.4 最小化镜像(CentOS-7-x86_64-Minimal-1708.iso)为模版 要达到的目的: 1.订制所需的rpm软件包集成到iso文件中 2.制作完成的ISO全自 ...

  9. Scrapy框架-CrawlSpider

    目录 1.CrawlSpider介绍 2.CrawlSpider源代码 3. LinkExtractors:提取Response中的链接 4. Rules 5.重写Tencent爬虫 6. Spide ...

  10. Hexo server报错TypeError: Cannot read property 'utcOffset' of null解决方法

    最近刚刚开始使用Hexo,新建了一篇article,运行hexo server时候总是报错Cannot read property 'offset' of null. 最后发现是因为手贱把_confi ...