详解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 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
关于Django外键赋值问题详解
Aug 13 Python
Python 逐行分割大txt文件的方法
Oct 10 Python
pandas读取csv文件,分隔符参数sep的实例
Dec 12 Python
python+opencv实现霍夫变换检测直线
Oct 23 Python
python如何爬取网站数据并进行数据可视化
Jul 08 Python
Django实现发送邮件功能
Jul 18 Python
python运用pygame库实现双人弹球小游戏
Nov 25 Python
python实现在线翻译功能
Mar 03 Python
Python restful框架接口开发实现
Apr 13 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
Python基本知识点总结
Apr 07 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
php后台如何避免用户直接进入方法实例
2013/10/15 PHP
分享精心挑选的12款优秀jQuery Ajax分页插件和教程
2012/08/09 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
js和css写一个可以自动隐藏的悬浮框
2014/03/05 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
基于JavaScript实现鼠标向下滑动加载div的代码
2016/08/31 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
常用的几个JQuery代码片段
2017/03/13 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
JS按条件 serialize() 对应标签的使用方法
2017/07/24 Javascript
原生JavaScript实现Ajax异步请求
2017/11/19 Javascript
Webpack实战加载SVG的方法
2017/12/26 Javascript
node.js中TCP Socket多进程间的消息推送示例详解
2018/07/10 Javascript
VUE组件中的 Drawer 抽屉实现代码
2019/08/06 Javascript
Vue的click事件防抖和节流处理详解
2019/11/13 Javascript
python中range()与xrange()用法分析
2016/09/21 Python
Windows下安装python2和python3多版本教程
2017/03/30 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
计算机二级python学习教程(1) 教大家如何学习python
2019/05/16 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
Django实现从数据库中获取到的数据转换为dict
2020/03/27 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
python 递归相关知识总结
2021/03/03 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
化妆师职业生涯规划书
2014/02/16 职场文书
拓展训练激励口号
2014/06/17 职场文书
财务部副经理岗位职责范本
2014/06/17 职场文书
人生遥控器观后感
2015/06/11 职场文书
《岳阳楼记》原文、译文赏析
2019/09/10 职场文书
OpenCV中resize函数插值算法的实现过程(五种)
2021/06/05 Python
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python