我就是这样学习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绘制人人网好友关系图示例
Apr 01 Python
Python下的Mysql模块MySQLdb安装详解
Apr 09 Python
用Python实现斐波那契(Fibonacci)函数
Mar 25 Python
Python中shutil模块的学习笔记教程
Apr 04 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
详解Django中间件的5种自定义方法
Jul 26 Python
用Django写天气预报查询网站
Oct 21 Python
Python中模块(Module)和包(Package)的区别详解
Aug 07 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
python实现将json多行数据传入到mysql中使用
Dec 31 Python
Windows安装Anaconda3的方法及使用过程详解
Jun 11 Python
Python 第三方库 openpyxl 的安装过程
Dec 24 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使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
2012/11/20 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
jQuery实现字符串按指定长度加入特定内容的方法
2015/03/11 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
2016/06/03 Javascript
通过jquery实现页面的动画效果(实例代码)
2016/09/18 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
JavaScript制作简单的框选图表
2017/05/15 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
[52:00]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 LGD vs Optic
2018/04/02 DOTA
栈和队列数据结构的基本概念及其相关的Python实现
2015/08/24 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
python 实现识别图片上的数字
2019/07/30 Python
pandas 空数据处理方法详解
2019/11/02 Python
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
new修饰符是起什么作用
2015/06/28 面试题
应聘自荐书
2013/10/08 职场文书
生物制药毕业生自荐信
2013/10/16 职场文书
前台文员岗位职责
2013/12/28 职场文书
楼面部长岗位职责范本
2014/02/14 职场文书
能源工程专业应届生求职信
2014/03/01 职场文书
小学生安全演讲稿
2014/04/25 职场文书
优秀德育工作者事迹材料
2014/05/07 职场文书
学校食堂标语
2014/10/06 职场文书
社区务虚会发言材料
2014/10/20 职场文书
平安家庭事迹材料
2014/12/20 职场文书
老公婚前保证书
2015/02/28 职场文书
校运会广播稿
2015/08/19 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
低门槛开发iOS、Android、小程序应用的前端框架详解
2021/10/16 Javascript