位置: 编程技术 - 正文

Python序列操作之进阶篇(python序列结构总结)

编辑:rootadmin

推荐整理分享Python序列操作之进阶篇(python序列结构总结),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python序列规则,python序列结构总结,python序列操作函数,python序列操作函数,python序列类型及运算,python 序列,python 序列,python 序列,内容如对您有帮助,希望把文章链接给更多的朋友!

简介

Python 的序列(sequence)通常指一个可迭代的容器,容器中可以存放任意类型的元素。列表和元组这两种数据类型是最常被用到的序列,python内建序列有六种,除了刚刚有说过的两种类型之外,还有字符串、Unicode字符串、buffer对像和最后一种xrange对像,这几种都是不常使用的。本文讲解了列表推导式、切片命名、列表元素排序、列表元素分组的使用方法。学习了 Python 基本的列表操作后,学习这些进阶的操作,让我们写出的代码更加优雅简洁和 pythonic 。

列表推导式

当我们想要根据某些规则来构造一个列表时,首先想到的应该是列表推导式。列表推导式简化了循环操作,例如我们想要从一个原始文件名列表中获取全部 .py 文件,在没有列表推导式的情况下,我们通常会这样做:

而如果使用列表推导式则可简化为:

列表推导式的介绍网上资源很多,不再赘述。这里只强调,当你需要根据某个规则来构造一个列表时,首先应该想一想,能否使用简洁的列表推导式来实现该需求,否则再回到常规的方式。

为切片命名

Python 的列表切片使用起来非常方便,但有时也会影响代码可读性。例如有一个字符串:

.6 为产品价格, 为产品数量,那么计算总价格为:

但是如果这样写,可能过一段时间我们再来读代码时已经忘记了 record[:] 、record[:] 切出来的究竟是什么?为了解决上述问题,可以给切片命个名来增强可读性。

slice 接收的参数格式为 slice(stop) 、slice(start, stop[, step]) 。如果只接收了一个参数,则等价于切片语法 [:stop] ,如果接收两个参数,则等价于切片语法 [start:stop] ,如果接收三个参数,则等价于切片语法 [start:stop:step] 。

排序

排序相关的任务通常由内置函数 sorted 完成。需要排序的元素一般存放在一个列表容器中,列表可以存放任意类型的元素,而 sorted 函数的 key 关键字使得我们能够轻松地指定元素排序的关键字,让排序变得异常简单。下面将给出几个常见的排序例子以说明 key 关键字的使用方法。注意 Python3 和 Python2 的排序方法不能通用,下面的例子只适用于 Python3 ,Python2 的排序方法未包含在本文中。

情况一

列表中的元素已经是可比较元素,直接将列表传入 sorted 函数即可返回一个已排序列表。默认为升序排列,降序排列可以指定 reverse 参数,例如:

情况二

需要排序的元素是一个元组或者字典,希望根据我指定的关键字来排序,例如有如下两个列表:

Python序列操作之进阶篇(python序列结构总结)

l_v1 是一个元组列表, l_v2 是一个字典列表。对 l_v1 我们希望根据元组中第二个元素来排序,对 l_v2 我们希望根据字典的关键字 uid 进行排序。

sorted 函数接收一个关键字参数 key ,该参数指定一个可调用函数,函数返回一个值(只要是可比较的),那么 sorted 函数将根据返回的关键字对列表中的元素进行排序。

例如对上面的例子:

这里 lambda 函数是一个常用的技巧。lambda 关键字后边的 x 是该函数接收的参数,冒号后边的表达式是该函数的返回值。对 l_v1 来说,传递给参数 x 的就是每一个元组,其返回元组的第二个元素用于排序;对 l_v2 来说,传递给参数 x 的就是列表中的每一个字典元素,其返回字典中 uid 对应的值用于排序。

除了使用匿名函数 lambda 这种通用的方法外,Python 标准库 operator 为我们提供了一个 itemgetter 函数替代我们写的 lambda 函数,且其性能会比使用 lambda 函数略有提升。

以上例子均是返回一个单一的值用于排序关键字,前面说过,关键字 key 接收的函数可以返回任意的可比较对象。例如在 python 中,元组是可以比较的。对元组的比较规则为首先比较元组中第一个位置上的元素,如果相等,在比较第二个位置上的元素,依次类推。回到 l_v2 的例子,假设现在需求变了,我们首先对 lname 对应的值排序,如果 lname 对应的值相等,那么再根据 fname 确定其顺序。

这个例子中,lambda 函数返回的不再是一个标量值,而是一个元组 (x['lname'], x['fname']) ,根据元组的比较规则,首先根据元组的第一个位置上的元素 x['lname'] 的大小排序,由于列表中有两个字典其 lname 对应的值都为 Jones,因此再根据元组第二个位置的元素 x['fname'] 的值排序,由于 Big 比 Brian 要小(按字母顺序依次比较),所以 Big 排在了前面。

同样使用 itemgetter 函数也是可以的,且性能会略有提升。此外我觉得 itemgetter 比 lambda 更加简洁和可读一点。

情况三

需要排序的元素是一个 Python 对象,我们希望根据其某个属性值来排序。例如一个存放 User 对象的列表如下,根据其 name 属性排序:

方法与前面的一样,定义一个函数返回 User 的 name 属性的值,把该函数传给 sorted 的 key 参数。

但是,itemgetter 方法不再起作用,取而代之的是 attrgetter 方法。

attrgetter 与 itemgetter 用法完全一致,只是 itemgetter 用于获取某个位置索引或者字典关键字的取值,而 attrgetter 用于获取对象的属性值。

PS:sorted 返回的是原始列表的一个已排序的副本,而原始列表的顺序并没有任何变化。如果你只想就地排序(即排序原始列表本身),则直接调用 list 的 sort 方法即可:list.sort() 。其用法与 sorted 函数一样,只是该函数没有返回值,调用后原始列表已变为一个已排序列表。

对序列中的元素进行分组

和排序类似,现想根据列表中元素的某个关键字分组,使关键字相同的元素分到同一组,并可以对分好的组进行进一步处理。例如有如下的一个列表:

列表的元素为字典,现想根据字典的 date 分组,使日期( date )相同的元素分到一个组。Python 的 itertools 模块中的 groupby 函数可以很好地解决该问题。为了使用 groupby 函数,首先需要对列表排序:

groupby 也和 sorted 一样有一个 key 关键字参数,其接收一个可调用函数,该函数返回的值被用做分组的关键字,其用法和 sorted 的 key 关键字参数一样 。

可以看到 groupby 返回的值分别是用于分组的关键字对应的值和该组的全部成员。groupby 实际返回一个生成器,通过迭代即可分别对各组进行处理。值得注意的一点是,分组前对列表排序这一步必不可少,否则对于非紧邻的元素即使其值相同也会被分在不同组。

总结

标签: python序列结构总结

本文链接地址:https://www.jiuchutong.com/biancheng/382425.html 转载请保留说明!

上一篇:利用Python破解验证码实例详解(手把手教你用python破解wifi)

下一篇:基于python的七种经典排序算法(推荐)(基于python的系统)

  • 印花税的账目处理
  • 小规模纳税人免税会计分录
  • 出口退税是按照出口金额吗
  • 企业外汇买卖业务流程图
  • 企业增加注册资本流程
  • 现金折扣销售退回的会计分录
  • 开票交税当月不确认收入如何做账?
  • 职工福利费税前扣除限额
  • 拿租金抵押金如何做账?
  • 现金流量表本月数和本年累计数不一致
  • 采购差价构成犯罪吗
  • 物业公司前期工作计划
  • 期末留抵税额大于销项税额本月还需要计提吗
  • 公账发工资是即时到账吗
  • 一般纳税人为其他公司制作标书怎么缴税?
  • 企业为员工提供住宿会计科目
  • 工会经费计税依据是上年工资还是当年工资
  • 免税销售额需要价税分离吗
  • 公益性捐赠的个税
  • 专利代理服务费入账
  • 个人独资企业生活费用扣除
  • php怎么配置环境
  • 借款人约定分期还款中途可以起诉吗
  • rundll32.exe应用程序错误 win7
  • 清理macbook清除系统垃圾
  • 债券利息计算表
  • 营改增前甲供材施工企业如何缴纳企业所得税
  • scvc8.exe是什么
  • win10默认网关不可用总掉线解决方法
  • thinkphp多模块
  • php判断查询是否有结果
  • php获取变量长度
  • PHP:imagestringup()的用法_GD库图像处理函数
  • 公司清算债权债务如何清理
  • Maximum call stack size exceeded错误
  • 境外向国内汇款新规
  • 光下的村庄环境描写
  • 工业企业制造费用包括
  • codeignitor
  • 一个惊艳了
  • sdiff命令 以并排方式合并文件之间的差异
  • Yii中的relations数据关联查询及统计功能用法详解
  • 查询命令的操作步骤
  • 记账凭证中的会计科目错误导致账簿错误的更正法
  • 企业分立股权比例发生变化的税务处理
  • 如何做进项税额明细表
  • 前置测试模型
  • 快递公司账务处理流程及方法总结
  • 向股东免息借款怎么做账
  • 【MongoDB for Java】Java操作MongoDB数据库
  • 利润表中本期金额是什么意思
  • 无资产可执行啥意思
  • 普惠性幼儿园是公立还是私立的?
  • 煤炭资源税优惠政策
  • 预付房租收到发票怎么写摘要
  • 企业发生亏损时,下列各项,( )是弥补亏损的渠道
  • 机票改签手续费有报销凭证吗
  • 原始凭证分割单怎么填写
  • 自动软件脚本
  • 所有符合条件x+5的绝对值加x- 2的绝对值等于七的数x
  • T-SQL中使用正则表达式函数
  • 打开与关闭光驱怎么设置
  • windows软件授权服务报告无法激活计算机
  • win7怎么更改音频输出
  • windows server 2016 自动登录
  • centos7 home
  • window10电池
  • Unity3D中Javascript的基本使用与介绍详解
  • ztree getnodebytid
  • node.js详解
  • nodejs怎么实现多线程
  • 容易混淆的词汇
  • jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
  • 陷阱类过关游戏
  • 十大上海企业纳税排行榜
  • 浙江网上税务局app下载
  • 信用社股金转让 办理要多少时间
  • 汽车发票含税吗
  • 武汉市国税局局长黄英简历
  • 北京社保登记证怎么办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设