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

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.kler.cn/a/598958.html

相关文章:

  • 前后端+数据库的项目实战:hbu迎新网-较复杂(下)javaweb
  • 蓝桥备赛(23)算法篇【枚举】
  • Hive与Spark的UDF:数据处理利器的对比与实践
  • 什么是量化?BERT 模型压缩的秘密武器
  • 深度解读DeepSeek:开源周(Open Source Week)技术解读
  • CCF-CSP认证 202209-2何以包邮?
  • jupyter使用过程中遇到的问题
  • 【Android】我们是如何优化安卓应用大小至10MB以下的
  • 基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)
  • 神经网络(Neural Network, NN)基础教程
  • python环境出现出现 pip: command not found 错误
  • python——UI自动化(1) selenium之介绍和环境配置
  • k8s主要控制器简述(一)ReplicaSet与Deployment
  • [工控机安全] 使用DriverView快速排查不可信第三方驱动(附详细图文教程)
  • 打破煤矿通信屏障,无线系统赋能生产安全与智能进阶
  • springmvc 框架学习
  • 三个print优雅打印datetime模块的“时间密码”
  • string kmp java
  • Edge浏览器登录微软账户报错0x80190001的解决办法
  • 数据结构C语言练习01