对Python列表的简单探索(一)

最近我在学Numpy(Python进行科学计算的拓展库),今天我恰巧看到了上个寒假买来的已经在书架上被冷落的《C++ Primer Plus》,突发奇想要写一篇关于python列表的文章。一个闲的没事干的肥宅总能找借口找点事做……


学过C/C++的朋友都了解,不少算法都是以数组操作为基础的,循环+数组的组合能处理很多问题。我在学习python的时候想找到一个类似C++数组这样的数据格式,刚开始觉得最像的是列表

可当我操作列表的时候,着实吃了一鲸

>>> a=[1,1.5,'2']
>>> a
[1, 1.5, '2']

为啥列表可以放不同类型的数据嘞??

这是因为C++的数组和python列表的存储结构有着本质不同
我们先来看C++的数组

数组名相当于一个指针,指向该数组的内存起始地址,数据类型就决定了数组里的数据大小,也就是说相邻下标对应地址的差是一定的。由此来看,数组是一个比较固定的存储结构,像一排大小相等固定的抽屉一样。

那么python列表的结构是怎样的呢?

1

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/发表我的文章


  1. 此图来自《Python数据科学手册》 【美】Jake VanderPlas 著
    此书已在GitHuB开源https://github.com/jakevdp/PythonDataScienceHandbook ↩︎

发布了3 篇原创文章 · 获赞 4 · 访问量 398

猜你喜欢

转载自blog.csdn.net/weixin_43608722/article/details/104314129