☆写在前面
任何一个算法,都是由逻辑和数据结构组成的。现在流行与世的编程语言有很多,比如Java、Python、C、C++等等,使用不同的编程语言可以实现一个相同的算法,除了一般的编程语言本身的语法规则有差异之外,主要的差异就在于编程语言支持的数据结构,因为逻辑都是一样的。一个好的数据结构,将使得编程过程、算法运行效率都更加的巴适!!!
Python语言是大家公认的最容易上手的语言,其背后的一个最重要的原因就是Python值支持的数据结构非常的灵活和完备,这篇文章要介绍的就是最为常用的一个序列数据结构:列表。
首先,对列表进行了解之前,我们需要对其Python支持的最为常用的数据结构进行梳理,如下图:
Python支持的一种数据机构的基本概念,我们称之为“容器”,也就是可以包含其他对象的对象,主要分为序列和映射,序列分为列表、元组及字符串等,他们都可以使用index来访问,而字典则是通过key来访问value的,也就是映射的涵义,当然我们也可以把序列看出key是0,1,2……的字典。当然,Python还有一种常见的数据结构,我们称之为集合(set),这里暂时按下不表。
目录
☆通用的序列操作
我们既然把列表、元组、字符串都归为序列类型,那么说明其必然有相同之处,事实也确实如此。有几种操作适合于所有的序列,主要包括索引、切片、相加、相乘和成员资格检查。
(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的特殊操作和方法,对可能引起混淆的知识进行了辨析,后续有新的关于列表的认识和新的知识点,将在这篇文章里持续更细~