详解python列表(list)的使用技巧及高级操作


Posted in Python onAugust 15, 2019

1、合并列表(extend)

跟元组一样,用加号(+)将两个列表加起来即可实现合并:

In [1]: x=list(range(1, 13, 2))
In [2]: x + ['b', 'a']
Out[2]: [1, 3, 5, 7, 9, 11, 'b', 'a']

对于已定义的列表,可以用extend方法一次性添加多个元素:

In [7]: x2=[3, 6, 1]
In [8]: x.extend(x2)
In [9]: x
Out[9]: [1, 3, 5, 7, 9, 11, 3, 6, 1, 3, 6, 1, 3, 6, 1]

需要说明的是:加号(+)执行列表的合并是非常浪费资源的,因为必须创建一个新列表并将所有对象复制过去,而用extend将元素附加到现有列表(尤其是在构建一个大列表时)就会好很多。

因此,在进行列表合并操作时,尤其是对于大数据量的列表合并,强烈建议使用extend函数。

2、列表排序(sort)

列表的sort方法可以实现就地排序(无需创建新对象,字符串按首字母进行排序):

In [10]: a=[1, 5, 3, -3, 0]
 
In [11]: a.sort()
 
In [12]: a
Out[12]: [-3, 0, 1, 3, 5]
 
In [13]: s=['a','ab','3e','z']
 
In [14]: s.sort()
 
In [15]: s
Out[15]: ['3e', 'a', 'ab', 'z']

sort有几个很好用的选项,一个是次要排序键,即一个能够产生可用于排序的值的函数。如可以通过长度对一组字符串进行排序:

In [16]: b=['a','nl','drz','mowgt','aa']
 
In [17]: b.sort(key=len)
 
In [18]: b
Out[18]: ['a', 'nl', 'aa', 'drz', 'mowgt']

再比如是否进行降序排列,如下面通过对首字母进行降序排列的示例:

In [21]: b.sort(key= lambda x:x[0], reverse=True)
 
In [22]: b
Out[22]: ['nl', 'mowgt', 'drz', 'a', 'aa']

3、 二分搜索及维护有序列表(bisect)

内置的bisect模块实现了二分查找以及对有序列表的插入操作。bisect.bisect可以找出新元素应该被插入到哪个位置以保持元列表的有序性,bisect.insort则将新元素插入到那个正确的位置上。

In [23]: import bisect
 
In [24]: c=[1,2,1,-1,4,5]
 
In [25]: c.sort()
 
In [26]: bisect.bisect(c, 2)
Out[26]: 4
 
In [27]: bisect.insort(c, 4)
 
In [28]: c
Out[28]: [-1, 1, 1, 2, 4, 4, 5]

注意:bisect模块的函数不会判断原列表是否有序,因为这样做开销太大;因此将他们用作无序列表时虽然不会出错,但可能会导致不正确的结果。基于此,建议在使用bisect模块的函数前,先对原列表执行排序的操作。

3、切片(索引运算符[]及start:stop)

可以对序列类型(数组、列表、元组等)进行切片操作,start索引处元素被包括在切片的结果中,stop索引处的元素未被包括在结果中,元素数量为 stop-start。start或stop都是可以省略的,此时他们分别默认为序列的起始处和结尾处。

还可以在第二个冒号后加上步长(step),比如每隔一位取一个元素:

In [35]: d=[x for x in range(10)]
 
In [36]: d
Out[36]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 
In [37]: e=d[:8:2]
 
In [38]: e
Out[38]: [0, 2, 4, 6]

可以巧妙的使用 -1 ,实现对列表或元素的反序,如下:

In [40]: f=d[::-1]
 
In [41]: f
Out[41]: [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

4、列表内置的序列函数

4.1 enumerate

enumerate函数可以逐个返回序列的(i, value)元组,如下示例:

In [43]: #for i value in enumerate(collection):
 
In [44]: #用 i, value 做一些事情
In [49]: slist=['qin', 'wang', 'wqc']
 
In [50]: mapping = dict((v, i) for i, v in enumerate(list))
 
In [51]: mapping
Out[51]: {'qin': 0, 'wang': 1, 'wqc': 2}

4.2 sorted

sorted函数可以将任何序列返回为一个新的有序列表(注意:sort函数是就地排序),如下:

In [59]: sorted(['z', 'd', 'c', 'n'])
Out[59]: ['c', 'd', 'n', 'z']
 
In [60]: sorted('my name is chaogo')
Out[60]:
[' ',
 ' ',
 ' ',
 'a',
 'a',
 'c',
 'e',
 'g',
 'h',
 'i',
 'm',
 'm',
 'n',
 'o',
 'o',
 's',
 'y']

常常将sorted和set结合起来使用以得到一个由序列中的唯一元素构成的有序列表:

In [61]: set(sorted('my name is chaogo'))
Out[61]: {' ', 'a', 'c', 'e', 'g', 'h', 'i', 'm', 'n', 'o', 's', 'y'}
 
In [62]: sorted(set('my name is chaogo'))
Out[62]: [' ', 'a', 'c', 'e', 'g', 'h', 'i', 'm', 'n', 'o', 's', 'y']
 
In [63]: set('my name is chaogo')
Out[63]: {' ', 'a', 'c', 'e', 'g', 'h', 'i', 'm', 'n', 'o', 's', 'y'}

上面的结果都是一样的,什么原因呢?这是因为:(1)set和sorted是对序列进行操作,当参数不是序列时,会默认转换为列表;(2)set默认会对元素进行排序。

4.3 zip

zip用于将多个序列(列表、元组等)中的元素“配对”,从而产生一个新的元组列表;zip可以接受任意数量的序列,最终得到的元组数量由最短的序列决定;zip最常见的用法是同时迭代多个序列,还可以结合enumerate一起使用,如下:

In [77]: seq1 = ['chao', 'qing', 'wq']
 
In [78]: seq2 = ['qin', 'wang', 'qc']
 
In [79]: for i , (a,b) in enumerate(zip(seq1, seq2)):
  ...:   print('%d: %s %s' % (i, a, b))
  ...:
0: chao qin
1: qing wang
2: wq qc

对于“已压缩的”(zipped)序列,zip还有一个很巧妙的用法,即对该序列进行解压(unzip,用*表示)。其实就是将一组行转换为一组列,如下:

In [86]: pitchers = [('a','b'), (1,2), ('tmd','bat')]
 
In [87]: one, two = zip(*pitchers)
 
In [88]: one
Out[88]: ('a', 1, 'tmd')
 
In [89]: two
Out[89]: ('b', 2, 'bat')

4.4 reversed

用于按逆序迭代序列中的元素,如下:

In [92]: [x for x in reversed([1, 2, 5, 3, -1])]
Out[92]: [-1, 3, 5, 2, 1]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python开发之list操作实例分析
Feb 22 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 Python
python3中dict(字典)的使用方法示例
Mar 22 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
Python学习笔记之字符串和字符串方法实例详解
Aug 22 Python
解决Django连接db遇到的问题
Aug 29 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
对django layer弹窗组件的使用详解
Aug 31 Python
python wxpython 实现界面跳转功能
Dec 17 Python
Python编程快速上手——PDF文件操作案例分析
Feb 28 Python
浅析Python实现DFA算法
Jun 26 Python
python中 Flask Web 表单的使用方法
May 20 Python
django项目中使用手机号登录的实例代码
Aug 15 #Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 #Python
python模拟键盘输入 切换键盘布局过程解析
Aug 15 #Python
django项目登录中使用图片验证码的实现方法
Aug 15 #Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
Aug 15 #Python
解析python的局部变量和全局变量
Aug 15 #Python
python实现的自动发送消息功能详解
Aug 15 #Python
You might like
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
2013/04/08 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
PHP添加Xdebug扩展的方法
2014/02/12 PHP
php输入流php://input使用浅析
2014/09/02 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
PHP实现的链式队列结构示例
2017/09/15 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
jQuery 处理表单元素的代码
2010/02/15 Javascript
js中把JSON字符串转换成JSON对象最好的方法
2014/03/21 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
Vue服务器渲染Nuxt学习笔记
2018/01/31 Javascript
详解Vue源码之数据的代理访问
2018/12/11 Javascript
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
[40:56]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs TNC
2018/04/01 DOTA
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
在windows系统中实现python3安装lxml
2016/03/23 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
python tkinter组件使用详解
2019/09/16 Python
用python实现名片管理系统
2020/06/18 Python
意大利宠物用品购物网站:Bauzaar
2018/09/15 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
外企求职信范文分享
2013/12/31 职场文书
《水上飞机》教学反思
2014/04/10 职场文书
优秀党支部申报材料
2014/12/24 职场文书
通知函格式范文
2015/04/27 职场文书
2015年共青团工作总结
2015/05/15 职场文书
二十年同学聚会致辞
2015/07/28 职场文书