前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python入门(15)

Python入门(15)

作者头像
高一峰
发布2020-09-22 09:53:51
5160
发布2020-09-22 09:53:51
举报
文章被收录于专栏:高渡号外
Python入门(15/18)

第十五节 应用案例(三)

大家好!昨天的案例分析,我们过了一把瘾,今天我们集中精力再来讲一个相对复杂的关于二维数据排序的案例。

所谓二维数据排序,我想大家应该对Execl的数据表的排序有印象,它是可以按任意列来排序的。这样的数据表,就是一种典型的二维数据,它能够实现快速的任意列排序,为我们的日常工作带来极大的便利。那如果,这个表的排序功能需要我们来设计它的程序代码,我们该怎么做呢?

其实,对于一组二维数据,单独就一个行或者一个列的数据来说,它的排序是很简单的,不考虑Python的内置排序函数,至少也能用冒泡排序算法来搞定它们。

但是,问题复杂就复杂在,数据表里的行和列的数据不是孤立的。

每一个列代表了同一个计量类别在不同对象上的计量值,我们通常称之为字段与字段值。而数据表的每一个行表示了同一个计量对象,在不同计量类别上的计量值,我们通常把一个行称之为一条记录,它存储了同一个计量对象的不同计量特征的计量值。

理解了字段和记录的意义,我们后面的描述就要简单得多。

也就是说,同一条记录的每一个字段的值,都是代表这条记录的某一个特征的,那么,它就不能随意的挪动,如果某个列的某个值因为这个列的排序而突然换行了,那它还是标识它原来那条记录的某个特征的吗?显然不是,因为它不在那一行了,它变成了别人家的特征。

只有一种可能性能够维持原来整张数据表(即二维数据)的表意特征,而不至于造成数据混乱,那就是,如果一条记录的某个列的数据因为排序而发生了位置改变,那么,这条记录的其他列的位置也应该同步发生改变,也就是说,它是整行一起迁移的,这样,不仅这个行的数据记录依然是完整的,同时也不会因为它的变动而影响其他行的数据记录,所有属于同一行的数据依然还在同一个行,属于同一条记录(没有跑到别人家)。

所以,我们可能已经发现了解决类似问题(二维数据排序问题)的法门,就是某个列的排序,不是孤立的列的数据排序,而是整行数据记录的位置的同步迁移。

好了,到此为止,我们终于有勇气来面对今天的案例了。

案例6、一组二维数据实现按任意列排序

需求:假设数据如下:

1,'a',2.35

5,'d',7.22

0,'c',8.99

3,'b',5.33

2,'e',6.99

请按任意列排序。

需求分析

(1)这里有5行3列数据,其中第1个列的数据是整数,第2个列的数据是字符串,第3个列的数据是小数。我们可以用一个二维的列表来表示这一组二维数据,二维数据的一行记录,构成列表的一个对象(元素),因此,列表将有5个对象(元素)。

(2)我们要排序的不是行,而是列。因为,通常情况下,我们会把同一个类型特征值记录在一个列中,它们因此具有可比性。当然,如果不考虑现实意义和可比性,一定要按行来排序,算法的逻辑应该是一样的,事实上,我们马上就会这样做。

(3)为了能够将不同行的同一个列的数据拿来排序(比较大小),我们就需要首先对这个列表的数据进行一下行列转换,让它变成一个三行五列的二维数据。请注意,这样的转换没有任何其他的目的,纯粹就是为了让每一个列的数据能变成列表的一个独立对元素,方便排序操作,重要的是这样的转换完全没有改变数据间的对应关系。

(4)如果排序顺利的话,我们再来一个逆转换(再一次行列转换),你能想象到什么吗?那不就是我们想要的最终的排序结果吗?

(5)所以,问题最后集中到在行列转换以后,一个新的行的数据如何实现排序的问题。同理吧,在二维数据中,一个行的排序,是不是应该也是相关列的位置前移问题?OK,理解这个了,事情就真的变得简单了。因为,一个列表对象的本身的排序仅仅是一个排序函数的问题,一招即可搞定。

好了,说了这么多,大概有点烧脑了,真是不好意思。不过,咱们要知道,脑子是个好东西,人人都不缺,但好不好使,差别就大了。须知越烧越灵光,何乐而不烧呢?我烧我光荣啊!

下面给出了二维数据实现按任意列的排序源代码。

PS:为了方便初学者理解,我们做了逐行注释,这样做纯粹是为了新手方便理解。请注意,正常情况下,逐行注释是有点找骂,吃力不讨好的哦。这是为什么?因为阅读代码的人可能感觉你把人家“大牛”当“小白”了呗,你关键位置注释一下可以,逐行注释是几个意思啊?难道我一行代码都看不懂?就你牛逼,咱都是蠢货?草...谁没个自尊心和优越感呢?你看看,你看看,无端的好心当做驴肝肺,吃力不讨好,还得罪人了呗,所以呀,江湖险恶啊,兄弟!凡事适而可止,过犹不及,至理名言、至理名言呀。

代码解析:

1、任何一个二维的数据,都可以定义为一个二维的列表list,它实际上是一个嵌套的列表,也就是说列表的每一个元素,仍然还是一个列表对象。但是,请注意,并不是每一个包含嵌套列表的列表都是一个二维数据。因为,它所包含的每一个嵌套的列表是否具有一致的数据类型和列表长度,是决定它能否看做一个二维数据的关键。

2、我们在理解列的排序时,为了保证数据结构不变,列的排序,实际上也可以理解为行的次序的调整。

3、实现行列转换,在操作上是一个关键的点。我们由此想到了zip()函数的行列转换功能,借助zip(*list)函数对列表数据进行行列转换以后,会产生一个以列为单位的元组的列表,然后,再进行排序就要方便得多。

4、要点是,在按照指定的列元素进行排序后,相应的其他列也要进行同步位置迁移,更准确的说是同步的索引变更。请注意,代码实现的细节:在进行行列转换后,原来的每个列都变成了一个元组,这样,其他列只需要参照指定列排序后的索引变化,进行相同的索引变更,就能实现所有列的同步更新。

5、最后,再使用zip()函数还原,就实现了二维数据按指定列的排序操作。

小结

截止今天的分享,我们一共实战了6个Python应用程序设计案例。这让我们初步领略了python程序设计之美,大道至简,优雅美妙!

到此为止,python最基础和最常用的知识点,我们都分享给大家了。

需要强调的是,任何一个需求的解决方案都不是唯一的,大家可以多多尝试寻找不同的解决方案,并在留言区反馈给我们。为了巩固学习成果,建议大家课后还可以寻找更多的设计课题,多动脑、多动手,铁杵磨成针,功到自然成!

预告

接下来,我们将要分享的是python面向对象的编程,这将是非常非常重要的内容。学会了面向对象编程的思维能力和方法,毫无疑问,将不仅进一步提升我们的python编程水平,还让我们向高手的境界又迈进了一大步。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高渡号外 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档