最近我在学Numpy(Python进行科学计算的拓展库),今天我恰巧看到了上个寒假买来的已经在书架上被冷落的《C++ Primer Plus》,突发奇想要写一篇关于python列表的文章。一个闲的没事干的肥宅总能找借口找点事做……
学过C/C++的朋友都了解,不少算法都是以数组操作为基础的,循环+数组的组合能处理很多问题。我在学习python的时候想找到一个类似C++数组这样的数据格式,刚开始觉得最像的是列表
啦
可当我操作列表的时候,着实吃了一鲸
>>> a=[1,1.5,'2']
>>> a
[1, 1.5, '2']
为啥列表可以放不同类型的数据嘞??
这是因为C++的数组和python列表的存储结构有着本质不同
我们先来看C++的数组
数组名相当于一个指针,指向该数组的内存起始地址,数据类型就决定了数组里的数据大小,也就是说相邻下标对应地址的差是一定的。由此来看,数组是一个比较固定的存储结构,像一排大小相等固定的抽屉一样。
那么python列表的结构是怎样的呢?
Python 列表包含一个指向指针块的指针,这其中的每一个指针对应一个完整的 Python 对象,列表中的每一项必须包含各自的类型信息、引用计数和其他信息
因为 Python 的动态类型特性,可以创建一个异构的列表
在我学过pyhton列表的操作后,我觉得它更像是C++数据结构里的线性表,反而不像数组了,而且pyhton的array
就是C风格的数组
本文重点介绍列表的创建
001.列表的初始化
在习惯了C/C++后我先使用for 循环来进行列表的创建
a=[]
for i in range(10):
a.append(i)
这无疑是一种C的风格,那在python里的习惯是怎样的呢
a=list(range(10))
创建这种有规律的数组,可以使用range()
range(start,end,step)是有三个参数的方法,前两个参数组成一个前闭后开区间,注意是前闭后开
,第三个参数规定步长,比如要创建一个[1,100]的偶数列表
a=list(range(2,101,2))
那么,如何创建带有一种操作的数值列表呢,我们以平方为例,创建一个1到100的平方的列表
a=[]
for i in range(1,101):
a.append(i**2)
如果你看到这里吐槽这个代码非常C风格的话,说明你对python的风格有点熟悉了
我们完全可以把for循环放在列表内部
a=[i**2 for i in range(1,101)]
虽然代码量减少了,但逻辑依旧清晰,这就是流畅的pyhton
那我们要创建一个单一数据的列表应该怎么操作
zeros_list=[i-i for i in range(100)]
我预料到此时气氛有一丝尴尬。好丑陋的代码啊,没错,当时的我确实想过这种方法,但python无疑提供了更简洁的方法
zeros_list=[0]*100
woc无情……pyhton总能给初学者惊喜
之前提到过,列表是一种动态可变的结构,类比于C/C++的二维数组,我在这里介绍列表嵌套列表(列表可以嵌套字典等别的结构,这里不做介绍)
a=[]
for i in range(3):
a.append(list(range(3)))
print(a)
[[0, 1, 2], [0, 1, 2], [0, 1, 2]]
一个列表嵌套列表就完成了,也可以无限套娃
列表套列表套列表列表套列表套列表列表套列表套列表……
010.列表的索引
列表的索引和C/C++的非常类似,都是用[]
a=list(range(10))
print(a[0])
0
但数组的索引范围只能是[0,len-1],而列表的索引拓展到了负数
print(a[-1],a[-10])
9 0
-1表示从列表末尾数数第1个即最后一个
同理-10是倒数第10也就是第一个
对于嵌套列表来说可以这样
a[0][0]
把a[0]看成一个列表名,后面直接加[]
011.切片
切片是列表非常有意思的操作,可选择列表的一部分,省去了for循环的生硬操作
列表名[start:end:step]
切片的三个参数和range()一样,再次注意前两个参数是前闭后开区间。三个参数都可以省略,不同的省略导致不同的结果
a[::] #遍历整个列表,相当于a[0:len(a):1]
a[:x] #从开始到x-1,步长为1
a[x:] #从x到len(a),步长为1
a[::2] #遍历真个列表,步长为2,隔一个元素读一个
a[::-1] #将数组逆序
a[::-1]
这个操作我之前介绍过,这是一种非常简洁的逆序操作
值得注意的是,无论你对切片怎么操作,原始数组是不会发生改变的
>>> a=[1,2,3]
>>> id(a)
2575698557760
>>> id(a[::])
2575706379456
使用id查询变量地址,我们可以发现,切片返回的是一个新的列表
切片也可以应用在字符串上
在下一篇文章中我将介绍更多与列表相关的操作
我是Vito,数据科学与大数据技术专业大二的学生,学习python半年。这是我的第三篇原创博客,以后我会陆续介绍学习python的一点心得。
除了在CSDN上发布博客,我也会在矿大计算机学院资源传承计划(Resource Inheritance Plan of CUMTCS)这个GitHub资源库里分享我的学习资料以及在矿大计算机学院资源传承计划·博客https://cumtcssuld.github.io/发表我的文章
此图来自《Python数据科学手册》 【美】Jake VanderPlas 著
此书已在GitHuB开源https://github.com/jakevdp/PythonDataScienceHandbook ↩︎