详解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输出PowerPoint(ppt)文件中全部文字信息的方法
Apr 28 Python
python获取指定时间差的时间实例详解
Apr 11 Python
Flask框架web开发之零基础入门
Dec 10 Python
Python中的引用知识点总结
May 20 Python
Python 二叉树的层序建立与三种遍历实现详解
Jul 29 Python
pandas的排序和排名的具体使用
Jul 31 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
Pycharm小白级简单使用教程
Jan 08 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
关于Kotlin中SAM转换的那些事
Sep 15 Python
教你使用Python pypinyin库实现汉字转拼音
May 27 Python
python异常中else的实例用法
Jun 15 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
神族 Protoss 历史背景
2020/03/14 星际争霸
php缓存技术介绍
2006/11/25 PHP
Ajax+PHP快速上手及简单应用说明
2013/07/24 PHP
php简单随机字符串生成方法示例
2017/04/19 PHP
PHP使Laravel为JSON REST API返回自定义错误的问题
2018/10/16 PHP
PHP whois查询类定义与用法示例
2019/04/03 PHP
保证JavaScript和Asp、Php等后端程序间传值编码统一
2009/04/17 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
javascript面向对象入门基础详细介绍
2012/09/05 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
jquery仿百度百科底部浮动导航特效
2015/08/08 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
javascript将json格式数组下载为excel表格的方法
2017/12/22 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
vue component 中引入less文件报错 Module build failed
2019/04/17 Javascript
layui上传图片到服务器的非项目目录下的方法
2019/09/26 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
vue项目配置使用flow类型检查的步骤
2020/03/18 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
解决vuecli3中img src 的引入问题
2020/08/04 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
Python比较两个图片相似度的方法
2015/03/13 Python
python中实现k-means聚类算法详解
2017/11/11 Python
详解如何将python3.6软件的py文件打包成exe程序
2018/10/09 Python
html5 Canvas画图教程(9)—canvas中画出矩形和圆形
2013/01/09 HTML / CSS
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
英国时尚女装购物网站:Missguided
2018/08/23 全球购物
英语故事演讲稿
2014/04/29 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
公司委托书怎么写
2014/08/02 职场文书
总经理致辞
2015/07/29 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书