重走Python之路:一文搞懂列表(list)操作的方法

☆写在前面

任何一个算法,都是由逻辑和数据结构组成的。现在流行与世的编程语言有很多,比如Java、Python、C、C++等等,使用不同的编程语言可以实现一个相同的算法,除了一般的编程语言本身的语法规则有差异之外,主要的差异就在于编程语言支持的数据结构,因为逻辑都是一样的。一个好的数据结构,将使得编程过程、算法运行效率都更加的巴适!!!

Python语言是大家公认的最容易上手的语言,其背后的一个最重要的原因就是Python值支持的数据结构非常的灵活和完备,这篇文章要介绍的就是最为常用的一个序列数据结构:列表。

首先,对列表进行了解之前,我们需要对其Python支持的最为常用的数据结构进行梳理,如下图:

 Python支持的一种数据机构的基本概念,我们称之为“容器”,也就是可以包含其他对象的对象,主要分为序列和映射,序列分为列表、元组及字符串等,他们都可以使用index来访问,而字典则是通过key来访问value的,也就是映射的涵义,当然我们也可以把序列看出key是0,1,2……的字典。当然,Python还有一种常见的数据结构,我们称之为集合(set),这里暂时按下不表。


目录

☆写在前面

☆通用的序列操作

(1)索引

(2)切片

(3)序列相加

(4)序列相乘

(5)成员资格检查

☆Python的主力干将:列表的操作与方法

(1)函数list

 (2)基本的列表操作

 (3)列表方法


☆通用的序列操作

我们既然把列表、元组、字符串都归为序列类型,那么说明其必然有相同之处,事实也确实如此。有几种操作适合于所有的序列,主要包括索引、切片、相加、相乘和成员资格检查

(1)索引

a_list = [1,2,3,"world","it",[4,5,6]]

# a_list[0]
# 1

# a_list[-1]
# [4,5,6]

 序列中的所有元素都有编号,从左到右,从0开始递增;从右到左,从-1开始递减 ,这一点需要牢记。上面的例子说明了,列表的内容可以是不同的类型,包括更加复杂的对象,这与Java等编程语言中的一维数组等具有很大的区别,更加凸显Python的灵活性。

当然,还有很多新奇的操作,比如下面这样。当你见到它时,请不要感到陌生。

# 直接对一个字符串字面量进行索引操作,其他序列一样
"hello world"[1]
[12,34,34,45][2:]

# 如果一个函数调用返回的是一个序列,也可以直接对其进行索引操作
f = input("input your answer:")[1]

(2)切片

如上面例子中的 [12,34,34,45][2:],你或许会问后面的[2:] 是什么意思?这就是切片(slicing)了。使用切片用来访问特定范围内的元素,也就是数学上区间的概念,它是由两个索引和冒号构成的。听起来是不是很简单,但是,切片并不是很容易被我们掌握的。需要注意以下几点。

【1】两个索引实际上是左闭右开的区间结构,也就是说,第一个索引是包含第一个元素的编号,而第二个索引是切片后余下的第一个元素的编号

 ok,你以为你全部掌握了吗?别忘记了,我们还有负值索引,这可真的是个麻烦事。

【2】负值索引的奇怪之处

# 注意,这里的numbers就是上文图中的[1,2,3,……,10]
>>> numbers[7:10]
[8,9,10]

# 使用负值索引居然取不到最后一个元素
>>> numbers[-3:-1]
[8,9]

# 直接取不到任何元素,而返回一个空的列表
>>> numbers[-3:0]
[]

# 这样是对的
>>> numbers[-3:]
[8,9,10]

 这并不值得我们惊慌,紧紧把握住一点,那就是切片是左闭右开的,那么[-3:-1],实际上取不到-1,而在序列的索引空间中,-1的后面不是0,-1是最后一个元素,而0是第一个元素,是不是很有趣。如何解决呢?这里有了省略的写法,它表示的是某一个位置直到序列的最后,由此,我们可以使用numbers[:],表示对整个序列的复制

【3】步长的概念

实际上的切片都是包括三个参数的,开始index、结束index和步长,默认步长是1,也就是顺序去取值。而步长就是描述跳过几个元素而去取值的配置参数。比如:

numbers[0:10:2]
# [1,3,5,7,9]
numbers[3:6:3]
# [4]

 步长也可以是负数,怎么样?搭配起来是不是很刺激呢。

 总结来说,切片是一个颇费思量的方法,一般我们也不会去使用步长的特别设置,实在需要了,你就写个dev版本测试一下嘛,试一试总是保险的。

(3)序列相加

序列是可以拼接的,也就是相加的概念。

 这没有什么需要强调的,但是一般而言,不同类型的序列之间不可以直接使用加号进行拼接

(4)序列相乘

当序列与一个数X相乘时,就是对这个序列进行X次的重复。

 这里也没有啥需要强调的,给大家看一个例子:

 这个小文本框你真的以为是别人手动打出来的吗?哈哈哈,使用我们这里的知识你就可以程序生成哦。

(5)成员资格检查

也就是使用“in”判断特定的值是不是在这个序列里面,他的返回值是一个布尔类型的,这在判断等表达式中使用十分广泛。

 

 当然了,还可以对序列进行长度、最大值、最小值的计算,主要是len()、max()、min()等的使用,这里不再赘述。

☆Python的主力干将:列表的操作与方法

(1)函数list

list("hello")
# ["h","e","l","l","o"]

 将字符串转换为列表,哪又如何把字符列表转换为字符串呢?下面就是其逆操作。

"".join(somelist)

(2)基本的列表操作

【1】赋值操作

我们可以通过索引或者切片的方法给一个列表修改值。你不可以对一个字符串和元组进行按索引的赋值操作,这是非法的。

【2】删除元素

删除一个列表的元素有很多种方法,包括del、remove、pop三种。

① del语句

②remove方法:删除第一个指定的值得元素,对原列表进行修改,且不会有返回值。如果没有就会报错!!!

 ③pop方法:不传递参数时候是pop末尾元素,也可以指定index而pop指定位置参数,有返回值,对原来的列表进行修改。

 *说明:方法都是 object.method( ),使用的是点操作符,这是方法的引用方法。

【3】给切片赋值

 切片赋值就是一种赋值操作,不过,使用切片可实现一些很有趣的功能,如上面所示。

(3)列表方法

【1】append用以将一个对象附加到列表末尾

【2】clear就地清空列表的内容

【3】列表的复制

b与a的赋值,其本质是一种对象地址的引用,类似于C语言中的指针。在空间中只有一份保存。copy()方法是一种完全复制,存储空间中存在有两份数据,完全一致。

【4】count方法用以统计指定元素在列表中出现的次数

【5】extend将多个值附加到列表的末尾,它看起来类似于序列的相加,但是不同的是,extend会修改被扩展的列表,extend等价于a = a + b。很显然,前者的效率更高。

【6】index在列表中查找第一次出现该值的索引

【7】insert  用于将一个对象插入列表

【8】reverse按照相反的顺序排列列表中的元素

【9】列表的排序

①sort方法:对列表进行排序,且是对原列表的修改,没有副本一说,更没有返回值

②sorted函数 ,使用该函数也可以完成对列表的排序,但是不同于sort,它不修改原始列表,而是通过copy后,进行排序,有返回值。

 到这里,Python的列表部分知识就介绍完了。主要是将序列的通用知识进行了说明,重点阐述了List的特殊操作和方法,对可能引起混淆的知识进行了辨析,后续有新的关于列表的认识和新的知识点,将在这篇文章里持续更细~

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值