当前位置: 首页 > news >正文

Python Cookbook-4.8 二维阵列变换

任务

需要变换一个列表的列表,将行换成列,列换成行。

解决方案

需要一个列表,其中的每一项都是同样长度的列表,像这样

arr = [[1,2,3],[4,5,6],[7,8,9],[10,11,12]]

列表推导提供了简单方便的方法以完成二维阵列的转换:

print [[r[col] for r in arr] for col in range(len(arr[0]))]
[[1,4,7,10],[2,5,8,11],[3,6,9,12]]

另一个更快也更让人困惑的方法(输出是一样的)是利用内建函数zip 实现的:

print map(list,zip(*arr))

讨论

本节展示了一种简洁而清晰的转换方式,还有一个更快速的备选方案。在需要简洁和清晰并存的时候,列表推导通常是很好的选择,而备选方案利用内建函数 zip 以另外一种方式达到目的,显得很晦涩难懂。

有时,你获得的数据的顺序是不正确的。举个例子,如果使用微软的ActiveX DataObjects(ADO)数据库接口,由于Python和微软的首选实现语言(VisualBasic)在对数组元素排序上的差异,Getrows方法返回的实际上是Python中的列。本节针对这种常见需求提出的两种解决方案,让你有机会在清晰和速度之间进行选择。

在列表推导的解决方案中,内层推导改变的是(从行中)选出的元素,外层推导则影响选择子(selector,即列)。由此实现转换。

而基于 zip 的解决方案,我们使用了*a语法将 arr 中的每个元素(行),根据顺序,作为分隔开的参数传递给 zip。zip 返回的是元组的列表,其实已经完成了转换。通过 map调用,我们可以对每个元组调用 list,以获得一个列表的列表。既然我们不能将 zip 的结果直接当做列表使用,我们可以通过使用itertools.izip 来得到一点改进(因为 izip 并不会将结果当做列表载入内存,而是每次生成一个子项):

import itertools
print map(list,itertools.izip(*arr))

不过,对这个例子而言,这一点速度提升也许并不能抵消它所带来的复杂性。

如果要转换非常巨大的数字阵列,可以考虑Numeric Python和其他的第三方包。NumericPython 支持一系列变换以及轴旋转,这些数学转换能把大多数人绕晕。

*args 和**kwds 语法

*args(*通常紧跟一个标识符,你会看到a或者 args 都是标识符)是Python用于接收或者传递任意基于位置的参数的语法。当你接收到一个用这种语法描述的参数时(比如你在函数的def语句中对函数签名使用了星号语法),Python 会将此标识符绑定到一个元组,该元组包含了所有基于位置的隐式地接收到的参数。当你用这种语法传递参数时,标识符可以被绑定到任何可选代对象(事实上,它也可以是任何表达式,并不必须是一个标识符,只要这个表达式的结果是一个可迭代对象即可)。

**kwds(标识符可以是任意的,通常用k或者kwds 表示)是Python 用于接收或者传递任意命名的参数的语法。(Python有时候会将命名参数称为关键字参数,它们其实并不是关键字——只是用它们来给关键字命名,比如pass、for或 yield,还有很多。不幸的是,这种让人疑惑的术语目前仍是这门语言及其文化的根深蒂固的一个组成部分。)当你接收到用这种语法描述的一个参数时(比如你在函数的def语句中对函数签名使用了双星号语法),Python 会将标识符绑定到一个字典,该字典包含了所有接收到的隐式的命名参数。当你用这种语法传递参数时,标识符只能被绑定到字典(其实它也可以是表达式,不一定是一个标识符,只要这个表达式的结果是一个字典即可)。

当你在定义或调用一个函数的时候,必须确保*a和**k 在其他所有参数之后。如果这两者同时出现,要将**k放在*a之后。

http://www.dtcms.com/a/79954.html

相关文章:

  • ZooKeeper集群高可用性测试与实践:从规划到故障模拟
  • 单片机flash存储也做磨损均衡
  • 分布式训练与多GPU加速策略
  • 创造型设计模式
  • IP查询底层逻辑解析:数据包与地理位置
  • 【虚幻引擎UE5】SpawnActor生成Character实例不执行AI Move To,未初始化AIController的原因和解决方法
  • 嵌入式4-Modbus
  • 网络类型及数据链路层协议【复习篇】
  • MySQL身份验证的auth_socket插件
  • 使用 `pytest` 框架时,可以通过极限封装将 YAML 文件的读取、解析
  • Kotlin v2.1.20 发布,标准库又有哪些变化?
  • 设计模式在事件处理系统中的应用
  • Qt之MVC架构MVD
  • cmake教程
  • JAVA URL和URI差异对比
  • C语言入门知识(上)
  • 搭建React简单项目
  • lua垃圾回收
  • javaAPI文档中文版(在线版)
  • 绿盟面试题
  • centos家用笔记
  • 智能汽车图像及视频处理方案,支持视频智能拍摄能力
  • ModuleNotFoundError: No module named ‘flask‘ 错误
  • Cursor/windsurf+MCP+Blender自动建模还有多远
  • JimuReport与deepseek结合,颠覆现有BI模式
  • ASFF:Learning Spatial Fusion for Single-Shot Object Detection
  • 蓝桥杯 积木画
  • llama源码学习·model.py[3]ROPE旋转位置编码(4)ROPE的应用
  • Python八字排盘系统实现分析
  • flutter报错:Could not find com.meituan.android.walle:plugin