您的位置:首页 > 健康 > 养生 > 朝阳港网站建设方案_汕头网站建设技术托管_全网络品牌推广_网站seo策划方案案例分析

朝阳港网站建设方案_汕头网站建设技术托管_全网络品牌推广_网站seo策划方案案例分析

2025/3/24 1:59:29 来源:https://blog.csdn.net/weixin_52297428/article/details/146407015  浏览:    关键词:朝阳港网站建设方案_汕头网站建设技术托管_全网络品牌推广_网站seo策划方案案例分析
朝阳港网站建设方案_汕头网站建设技术托管_全网络品牌推广_网站seo策划方案案例分析

任务

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

解决方案

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

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之后。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com