我就是这样学习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中使用gzip模块压缩文件的简单教程
Apr 08 Python
python妙用之编码的转换详解
Apr 21 Python
谈谈python中GUI的选择
Mar 01 Python
flask入门之表单的实现
Jul 18 Python
python实现图片插入文字
Nov 26 Python
Python 实现训练集、测试集随机划分
Jan 08 Python
使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解
Jan 25 Python
浅谈pytorch池化maxpool2D注意事项
Feb 18 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
Nov 12 Python
python中四舍五入的正确打开方式
Jan 18 Python
Python 详解通过Scrapy框架实现爬取百度新冠疫情数据流程
Nov 11 Python
Python中的datetime包与time包包和模块详情
Feb 28 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
dedecms系统的广告设置代码 基础版本
2010/04/09 PHP
zf框架的registry(注册表)使用示例
2014/03/13 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
PHP PDOStatement::fetchObject讲解
2019/02/01 PHP
检查输入的是否是数字使用keyCode配合onkeypress事件
2014/01/23 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
jquery中EasyUI实现异步树
2015/03/01 Javascript
JS中的二叉树遍历详解
2016/03/18 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
webpack 1.x升级过程中的踩坑总结大全
2017/08/09 Javascript
ES6入门教程之变量的解构赋值详解
2019/04/13 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
JavaScript实现京东快递单号查询
2020/11/30 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
用Python编写简单的微博爬虫
2016/03/04 Python
Python pass详细介绍及实例代码
2016/11/24 Python
Python编程二分法实现冒泡算法+快速排序代码示例
2018/01/15 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
OpenCV哈里斯(Harris)角点检测的实现
2020/01/15 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
Django contrib auth authenticate函数源码解析
2020/11/12 Python
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
什么是Remote Module
2016/06/10 面试题
高级Java程序员面试题
2016/06/23 面试题
运动会广播稿300字
2014/01/10 职场文书
关于逃课的检讨书
2014/01/23 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
经济信息系毕业生自荐信范文
2014/03/15 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
学校教师培训工作总结
2015/10/14 职场文书
初中信息技术教学反思
2016/02/16 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电