我就是这样学习Python中的列表


Posted in Python onJune 02, 2019

1. 列表

对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且python的列表是比较强大的,它包含了很多不同类型的数据:整型数字,浮点型,字符串以及对象等。

不同于 C++ 和 Java,在 Python 中,没有在标准库中内置数组类型,而是通常利用列表来表示数组,同时它也比数组的使用要灵活得太多。

列表是 Python 中最基本的数据结构,列表中的元素的存储是有序的,所以我们可以直接利用索引去访问列表中的值。在学习数据结构时,我们知道,对一个数据结构的操作,无外乎增删改查四种。接下来本文将从这四个方面来介绍列表的一些常用小技巧。

1.1. 列表中的增

对列表的增加操作有两种,一种是创建一个新的列表,一种是在一个已有的列表中增加一个新元素。我们首先介绍如何创建一个新的列表:

# 创建一个空列表
list1 = []
# 创建一个默认值为0,长度为n的列表
list2 = [0] * n
# 利用列表生成式创建列表
list3 = [i for i in range(10)]
# 5*5 二维列表
list4 = [[i for i in range(5)] for j in range(5)]
# 利用其他数据结构生成列表, list() 函数接收一个可迭代对象作为参数
tuple1 = (1, 2, 3)
list5 = list(tuple1)

# 字符串转化为列表
str1 = "I love code"
# 每个元素作为列表中的一个元素
list6 = list(str1)
# 按照指定字符分割
list7 = str1.split(" ") # ['I', 'love', 'code']

在编程过程中,有时我们需要对一个列表进行操作,但是列表是一个可变对象,对列表的操作往往会改变其本来的顺序结构。因此,当我们不想改变列表原有的顺序结构,我们需要对旧的列表进行一个拷贝,然后在新的列表上进行操作。拷贝存在两种,浅拷贝和深拷贝。可能有人会对这两种拷贝存在疑问,他们得到的列表的形式不是一样的嘛?

是的,它们在拷贝后得到的列表形式确实是一样的。但是在进行操作时,就会有很大的差别了,特别是当你的列表中存在可变对象时。我们只需要记住一点,浅拷贝只复制不可变对象,而深拷贝不仅复制不可变对象,还复制了可变对象。以下进行举例说明:

# 如果一个列表中的元素都是不可变对象,可以直接用浅拷贝
list1 = [1, 2, 'i']

list2 = list1[::1] # 浅拷贝
list3 = [i for i in list1] # 浅拷贝
import copy
list4 = copy.copy(list1) # 浅拷贝

# 如果一个列表中的元素包含可变对象,要完成复制列表,需要用深拷贝
list5 = ["Will", 1, ["Python", "Java", "C++"]]
list6 = copy.deepcopy(list5)

为什么在包含不可变对象的时候,需要用到深拷贝呢?

上面我们说过,浅拷贝只拷贝不可变对象。当列表中存在可变对象时,我们可以发现其引用 id 是一样的,即它们是同一个对象,因此对 list5 的操作会影响到 list6 。而在深拷贝中,对于可变对象,在拷贝的新列表中会生成一个新的对象,所以对 list6 的修改不会影响到 list5 。

id(list5[2]) # 2195936916360
id(list6[2]) # 2195936916744

对列表的另一种增加操作就是在已有的列表的基础上增加元素了,主要包括以下几种操作:

list1 = ["I"]
# 在列表尾部增加一个新元素
list1.append("love")
# 合并两个列表
list2 = ["Apple", 3]
list1.extend(list2) # ["I", "love", "Apple", 3]
list1 = list1 + list2 # ["I", "love", "Apple", 3]
# 在指定位置插入元素
list1.insert(index=1, "not") # ["I", "not", "love", "Apple", 3]

1.2. 列表中的删

对数据结构的删除操作包括两种,删除整个列表,或者删除列表中的某些元素。对于从内存中删除整个列表,该操作十分简单:

list1 = [1, 2, 3]
del list1

对于删除列表中的元素,同样可以使用 del 语句,同时还可以使用 remove() 函数。

list1 = [1, 2, 3]
print(list1) # [1, 2, 3]
del list1[1] 
print(list1) # [1, 3]

# 移除某个值的第一匹配项
list2 = [1, 2, 2, 3, 5]
list2.remove(2) # 移除第一个值为 2 的元素

1.3. 列表中的改

修改操作即在原有的列表的基础上对其进行修改,上面以及介绍了增加和删除操作,这里就对不改变元素的个数的操作进行介绍,主要包括排序和反转列表等。

# 对一个整数列表进行排序
list1 = [9, 5, 6, 2, 7, 1, 3]
# 升序排列
list1.sort() # [1, 2, 3, 5, 6, 7, 9]
list1 = sorted(list1) # [1, 2, 3, 5, 6, 7, 9]
# 降序排列
list1.sort(reverse=True) # [9, 7, 6, 5, 3, 2, 1]
list1 = sorted(list1, reverse=True) # [9, 7, 6, 5, 3, 2, 1]

# 指定键值排序
list1 = [('a', 3), ('b', 2), ('c', 1)]
list1.sort(key=lambda x:x[1]) # [('c', 1), ('b', 2), ('a', 3)]

## 反转列表,即将原来的列表逆序排列
list2 = [4, 2, 3, 1]
list2 = list2[::-1] # [1, 3, 2, 4]
list2.reverse() # [1, 3, 2, 4]

1.4. 列表中的查

对列表的查找操作无外乎以下几种:

  • 遍历列表;
  • 查找指定索引的元素;
  • 查找指定值的元素;

列表的遍历方式有三种,分别是根据索引遍历、根据值遍历和 enumerate()遍历。

list1 = ["Python", "C++", "Java"]

# 方法 1
for i in range(len(list1)):
 print(list1[i])

# 方法 2 , 遍历速度最高效,但是无法记录索引
for i in list1:
 print(i)

# 方法 3
for index, val in enumerate(list1):
 print(val)

查找元素有两种,一种是按照索引查找,一种是遍历按值查找。

# 查找指定索引的元素
list1 = [1, 3, 2, 5, 7, 8]
list1[3] # 返回索引为 3 的元素,值为5

# 查找指定值的元素
key = 5
for i in list1:
 if i == key:
 print("OK")

# 查找最大元素和最小元素
max(list1) # 8
min(list1) # 1

1.5. 其它小技巧

上述介绍了列表的增删改查四种常用操作,当然对列表的操作不仅仅只有这些,例如还有两个列表的比较,列表结构的转化等等。

比较两个列表是否是一样的,这里的前提条件是这两个列表对象不是同一个对象。

list5 = [("car", 1), ("bike", 2), ("foot", 3)]
list6 = [("car", 1), ("bike", 2), ("foot", 3)]
# 判断两个列表是否是同一个对象
list5 is list6 # False
# 判断两个列表是否相等
list5 == list6 # True

# 当列表中的元素很多,且结构复杂时,可以使用 numpy 模块
import numpy as np
a = np.array(list5)
b = np.array(list6)
(a == b).all() # True

列表结构的转化主要包括将列表转化为元组、集合、字符串和字典:

list1 = ["a", "b", "c", "d", "c"]
# 列表转化为元组
tuple1 = tuple(list1) # ('a', 'b', 'c', 'd', 'c')

# 列表转化为集合
set1 = set(list1) # {'a', 'b', 'c', 'd'}

# 列表转化为字符串
str1 = "".join(list1) # 'abcdc'

# 列表转化为字典,元素为 key, 次数为 value
from collections import Counter, defaultdict
dict1 = Counter(list1) # Counter({'a': 1, 'b': 1, 'c': 2, 'd': 1})
# 或者
dict2 = defaultdict(int)
for i in list1:
 dict2[i] += 1
dict2 # defaultdict(int, {'a': 1, 'b': 1, 'c': 2, 'd': 1})

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python使用urllib2模块实现断点续传下载的方法
Jun 17 Python
python实现中文分词FMM算法实例
Jul 10 Python
python版微信跳一跳游戏辅助
Jan 11 Python
Python中的TCP socket写法示例
May 11 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
Django 接收Post请求数据,并保存到数据库的实现方法
Jul 12 Python
对DJango视图(views)和模版(templates)的使用详解
Jul 17 Python
python装饰器原理与用法深入详解
Dec 19 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
Python环境使用OpenCV检测人脸实现教程
Oct 19 Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 #Python
python实现感知机线性分类模型示例代码
Jun 02 #Python
python调用摄像头拍摄数据集
Jun 01 #Python
Python OpenCV实现视频分帧
Jun 01 #Python
python的set处理二维数组转一维数组的方法示例
May 31 #Python
python整合ffmpeg实现视频文件的批量转换
May 31 #Python
python自动发邮件总结及实例说明【推荐】
May 31 #Python
You might like
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
YUI的Tab切换实现代码
2010/04/11 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
vue 动态绑定背景图片的方法
2018/08/10 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
Vue项目前后端联调(使用proxyTable实现跨域方式)
2020/07/18 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
Windows下安装python2和python3多版本教程
2017/03/30 Python
python实现发送邮件功能代码
2017/12/14 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
Python hashlib模块用法实例分析
2018/06/12 Python
解决python3 安装完Pycurl在import pycurl时报错的问题
2018/10/15 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
2019/07/22 Python
python实现图片上添加图片
2019/11/26 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
html5页面结构_动力节点Java学院整理
2017/07/10 HTML / CSS
西班牙网上书店:Casa del Libro
2016/11/01 全球购物
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
速比涛英国官网:Speedo英国
2019/07/15 全球购物
优秀大学生推荐信范文
2013/11/28 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
培训演讲稿范文
2014/01/12 职场文书
保险经纪人求职信
2014/03/11 职场文书
中学生英语演讲稿
2014/04/26 职场文书
个人批评与自我批评
2014/10/15 职场文书
通用员工手册范本
2015/05/14 职场文书
校园开放日新闻稿
2015/07/17 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python