Python:列表;《Python编程 从入门到实践 第2版》

列表

本文根据《Python变成 从入门到实践 第2版》一书而写的类似于学习笔记的内容,对书里的一些内容写了一些自己的见解。

列表的形式

Python中的列表与Java、C、C++的Array很像,从数据结构上来看,都是线性数据结构。

在Python中,用方括号([])来表示一个列表,并用逗号来分隔元素。

vehicle = ['bicycle','bus','truck','car','plane','train']
print(vehicle)

**['bicycle', 'bus', 'truck', 'car', 'plane', 'train']**

列表结构就是这样的,但列表的访问方式有很多,而且通常,我们并不会直接访问整个列表,而是访问列表中的一些内容。

访问列表元素

列表是有序集合,我们可以通过下标来获得一个特定的元素,这与Java、C++等中的数组就非常相似了,只需要给出列表名[下标]这种形式即可访问元素,

print(vehicle[2])

truck

这样就是只获取vehicle列表的第三个元素,列表元素的下表是从0开始的,这一点是我们需要注意到的地方,当列表中有n个元素的时候,列表的长度即下标最大为n-1;

Python有一个相当有趣的地方,这也是它比较好用的原因之一,就是,存在负数的下标;Python可以用下标-1来访问最后一个元素,用-2来访问倒数第二个元素,这是Python比较好用的地方,因为有时候我们可能并不会记得一个列表中到底有多少元素;

print(vehicle[-1])

train

为什么下标-1就是列表的最后一个元素,而下标1则不是列表的第一个元素,这与列表的底层实现逻辑相关。

修改、添加和删除元素

Python中的列表大多数都是动态的,这使用起来是非常容易,如果用过C、C++或者Java的数组,就会知道,Python的列表使用起来已经算是最轻松的了,

修改列表元素

修改列表元素,可以通过访问列表的某个指定的下标,再重新指定该元素的值,

vehicle = ['bicycle','bus','truck','car','plane','train']
print(vehicle)
vehicle[-1] = 'subway'
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'bus', 'truck', 'car', 'plane', 'subway']

这样可以看到,vehicle的最后一个元素值已经被修改为subway;

在这里我们也可以使用extend方法,这种方法其最后的效果是与append的效果是一样的,在这里我写下如下注释:

append() 追加单个元素到List的尾部,只接受一个参数,参数可以是任何数据类型,被追加的元素在List中保持着原结构类型。此元素如果是一个list,那么这个list将作为一个整体进行追加,注意append和extend。

extend() 将一个列表中每个元素分别添加到另一个列表中,只接受一个参数;extend()相当于是将list B 连接到list A上。

也可以批量的修改列表的元素:

vehicle = ['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
print(vehicle)
vehicle[0:2] = ['bus', 'bicycle']
print(vehicle)
vehicle[0:2] = ['truck', 'bicycle', 'bus']
print(vehicle)
vehicle[0:2] = []
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bus', 'bicycle', 'truck', 'car', 'plane', 'train']
['truck', 'bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bus', 'truck', 'car', 'plane', 'train']

可以分析以上的结果:首先初始化一个vehicle的列表,向里面写入了六个初始值,并输出一次vehicle,然后对其元素进行修改[0:2],这表示对列表的前两个,即下标为0和下标为1的元素进行修改(在Python中[0:2],都是包括起始,但不包括截止的),第一次修改还是比较容易理解的,仅仅是将bicycle和bus做了一个调换,第二次修改仍然是[0:2],这其实只是对下标为0和下标为1进行修改,但是我们却删除了两个值,而增加了3个值。这是Python比较简单易用的原因,它并没有要求你去理解底层的实现逻辑。如果是传统的C语言,你可能不会轻松做到这种修改。

在列表末尾添加元素

在列表末尾添加新元素,最简单的方法就是将元素追加到列表上,使用append方法,

vehicle.append('motorcycles')
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'bus', 'truck', 'car', 'plane', 'train', 'motorcycles']

在列表中插入元素

在列表中是插入一个元素,即在中间的某个位置插入一个元素,使用insert方法;

vehicle.insert(1,'motorcycles')
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'motorcycles', 'bus', 'truck', 'car', 'plane', 'train']

可以看出,在下标为1的位置插入了motorcycles这一元素,而原来的元素则相应的向后偏移一位。

vehicle[1:1] = ['motorcycles']
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'motorcycles', 'bus', 'truck', 'car', 'plane', 'train']

我们也可以通过这种方式来进行插入,这是Python比较有趣的地方,也是Python比较简单的地方,它提供了很灵活的应用方式,如果仅仅是使用这种语言。

我们可以通过这种listname[x:x]=[’’]这种方式,加入多个元素。

注释:这种方法其背后逻辑是怎么样的,我目前还不知道,我想这需要去了解Python的一些源码,不过就使用效果而言,这是比较好用的,我认为。(会有内存管理或者什么其他的问题嘛?我不知道,我认为不会有太大的影响)我所知道的是,这种方法插入的元素,实际上是分配新的地址,来放置新的元素;而insert方法实际上也是这样一个思路,所以,为什么不尝试用这种方式来插入元素?

似乎我提出的这种方法有点离经叛道,准确地来说,因为很多博客都会给出append、insert这种标准函数,但实际上,Python的好处就是对你天马行空的代码,给出最大的宽容。

从列表中删除元素

从列表中删除一个元素,可以使用del语句

del vehicle[1]
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'truck', 'car', 'plane', 'train']

可以看到bus这一元素已经被删除了

也可以使用pop()方法来删除元素,pop这一方法实际上是把列表看作是一个栈,pop()方法会删除列表中某个位置的元素,并且将这一元素返回。对于Python来说,这可以有非常灵活的使用方法

vehicle.pop(1)
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'truck', 'car', 'plane', 'train']

因为pop会有一个返回值,所以,我们也可以取得这个值

str = vehicle.pop(1)
print(vehicle)
print(str)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'truck', 'car', 'plane', 'train']
bus

所以,如果你需要得到你所删除掉的元素的值,那么就请使用pop()方法,如果只是做一个删除,那就可以使用del语句

同时,del语句也可以这样使用:

del vehicle[1:3]
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'car', 'plane', 'train']

可以看出,del语句中,我们删除了[1:3]的元素,实际上就是删除了vehicle[1]和vehicle[2]这两个元素值,批量删除时,这是一个不错的方法。

我们也可以通过remove()方法实现通过值删除列表中的某个元素,有时候我们可能并不知道从列表中删除元素的位置,但是我们知道自己想要删除元素的值。

vehicle.remove('bus')
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'truck', 'car', 'plane', 'train']

remove()方法只删除遇到的第一个元素值为传入参数的元素,如果删除的元素在列表中多次出现,则需要利用循环来删除。

sort()与sorted()方法对列表元素进行排序

Python的sort()方法能够轻松地实现对列表元素进行排序,sort()方法是一种永久性地排序,即整个列表的顺序会永久改变

vehicle.sort()
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train']
['bicycle', 'bus', 'car', 'plane', 'train', 'truck']

当然sort方法是按照字母顺序来进行排序的,准确地说,应该是按照ASCII来进行排序。

vehicle = ['bicycle', 'bus', 'truck', 'car', 'plane', 'train','1bus','2car','tru1ck',' bus','Bus']
print(vehicle)
vehicle.sort()
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']
[' bus', '1bus', '2car', 'Bus', 'bicycle', 'bus', 'car', 'plane', 'train', 'tru1ck', 'truck']

可以看到带有空格的‘ bus’被拍到了第一位,‘1bus’则被排到了第二位,‘Bus’被排到了第四位,‘bus’则被排到了第六位,这很容易理解,对于以上的各种形式bus,首先按照第一位的ASCII码来进行排序,而空格的ASCII码最靠前,所以被拍到了第一位。如果有两个单词前几位相同,则按照第一个不同位的ASCII码来进行排序,就如上述‘tru1ck’和’truck’,虽然’truck’是比’tru1ck’短,但是前三位的字母ASCII码相同,所以无法确定前后顺序,但是第四位分别是‘1’和‘c’,而‘1’的ASCII码比‘c’的ASCII码小,故‘tru1ck’在‘truck’前面。

sort()方法还可以按照ASCII码逆序来对列表进行排序;只需要在方法中传入参数reverse = True;

注释:sort()方法并没有改变列表各个元素曾经分配的位置,即原来列表各个元素的存储空间是多少,排序后该元素的存储空间仍然是之前的那个;可能的一种解释,Python中的列表是一种链表的结构,sort只需要改变原来的指针关系,当然也有可能原本存储过下标,而后又更新的一个新的下标,这也是可能的;可以肯定它并不是C语言那样简单的结构,而是复杂设计的。———Miss.M

vehicle.sort(reverse = True)
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']
['truck', 'tru1ck', 'train', 'plane', 'car', 'bus', 'bicycle', 'Bus', '2car', '1bus', ' bus']

如果你不想改变原列表各个元素的位置关系,但是又想获得一个排序的列表,那么sorted()方法正合此意,sorted()方法不会对原列表进行修改。

注释:有趣的是,sorted()方法并不是如我想的,复制当前的列表到一个新的空间,并在这个新的列表上进行排序的,可以看到sortedvehicle的元素空间地址与vehicle的地址空间是相同的,所以,我想sorted方法是构建了一个空间,完成了新顺序与原列表元素的一个映射关系,这是我的推测。

sortedvehicle = sorted(vehicle)
print(sortedvehicle)
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']
[' bus', '1bus', '2car', 'Bus', 'bicycle', 'bus', 'car', 'plane', 'train', 'tru1ck', 'truck']
['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']

可以看到,原列表vehicle在排序后没有修改自己本身的顺序,我利用sorted()方法得到一个排序好的列表,并将返回值给到sortedvehicle,得到一个排好序的列表。

同样的,sorted()方法也可以对原列表进行逆排序,只需要添加一个参数reverse = True;通常来说这个参数默认为False。当然,sorted()方法不仅可以增加这一个参数,它有很多参数,有更加灵活的用法,这个可以去参考文档查看其他的参数及使用方法。

sortedvehicle = sorted(vehicle, reverse = True)
print(sortedvehicle)
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']
['truck', 'tru1ck', 'train', 'plane', 'car', 'bus', 'bicycle', 'Bus', '2car', '1bus', ' bus']
['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']

reverse()与reversed()方法翻转列表

通过reverse()方法可以翻转列表,

vehicle.reverse()
print(vehicle)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']
['Bus', ' bus', 'tru1ck', '2car', '1bus', 'train', 'plane', 'car', 'truck', 'bus', 'bicycle']

可以看到,这个列表被完全地翻转过来,原来下标为1的元素,现在变成了最后一个元素,reverse()方法是在被列表的基础上,对列表进行修改的翻转,即原列表的顺序已被改变

reversed()方法可以对列表、元组、字符串进行翻转,其有一个返回值,返回一个反转的迭代器。通过reversed()方法翻转的列表,其原列表内容不进行任何该改变,但是,由于返回一个迭代器,所以,要想获得其内容就要指明类型。

reversedVehicle = list(reversed(vehicle))
print(reversedVehicle)
print(vehicle)

['Bus', ' bus', 'tru1ck', '2car', '1bus', 'train', 'plane', 'car', 'truck', 'bus', 'bicycle']
['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']

有趣的是,这个返回的迭代器,我们可以将其指定为tuple类型,这样也是很不错的。Python的灵活性似乎就是这么有趣!

注释:值得注意的是,reversed()方法得到的翻转列表,其各个元素的存储空间仍然没有改变,这是一个真的很有趣的设计,Python的设计确实是很值得去看一下;

获取列表的长度

我们可以使用len()方法来获取列表的长度,也可以获得其他类型数据的长度:

lenth = len(vehicle)
print(lenth)

['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']
11

使用列表时避免下标溢出

下标也就是有些书上说的索引;

我们通常会忘记一个列表到底有多长,因为Python初始化一个列表,并没有要求我们直接给出下标信息,所以,如果你刚好想要输出最后一个元素或者倒数第二个元素,如果给出正向下标是有点麻烦的。我们可以使用-1来表示倒数第一个元素,-2表示倒数第二个元素。

当然,也有这样一种可能,我们可能是记得初始化的列表的长度的,但是,有时候我们总会忘记,列表的下标总是从0开始,那么列表最后一个元素的下标应该是(列表长度-1);有时候我们会直接给出列表长度来获取列表的最有一个元素,这就会报错。

print(len(vehicle))
print(vehicle[11])

Traceback (most recent call last):
  File "E:\PycharmProjects\learn\ListExample.py", line 78, in <module>
    print(vehicle[11])
IndexError: list index out of range
['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']
11

可以看到错误类型为:IndexError:list index out of range。

print(len(vehicle))
print(vehicle[-1])

['bicycle', 'bus', 'truck', 'car', 'plane', 'train', '1bus', '2car', 'tru1ck', ' bus', 'Bus']
11
Bus

当程序报错的时候,我们可以通过编译器给出的错误类型来处理出现的错误,编译器能够给出错误信息的错误大概是最好改正的了!

附录

ASCII码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SUNX-T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值