数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构。在python中最基本的数据结构是序列。序列中每一个元素被分配一个序号——即元素的位置,也称为索引。第一个元素的索引为0,第二个则是1,以此类推。

    python包含6中内建序列,我们重点介绍的就是列表和元组。二者的区别是列表可以修改而元组不能修改。

  1. 通用序列操作,也就说我们要介绍的是针对序列的操作。所有的序列类型都可以进行某些特定的操作。这些操作包括:索引,分片,加,乘以及检查某个元素是否属于序列的成员。

    1>索引

序列中的所有元素都是有编号的——从0开始递增。这些元素可以通过编号开始访问。如下:

>>> greeting="Hello"
>>> greeting[0]
'H'

字符串就是一个由字符组成的序列。这就是一个索引,可以通过索引获取元素,所有序列都可以通过这种方式进行索引。使用负数进行索引时,python会从右边进行计数,最右边一个元素的索引为-1.

    字符串的字面值可以直接进行索引,而不需要一个变量引用他们。

>>> 'Hello'[2]
'l'
>>> "Hello"[2]
'l'
>>> Hello[2]                         / 这样引用时字符串必须添加引号
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'Hello' is not defined

    如果一个函数调用返回一个序列,那么可以直接对返回的结果进行索引操作。

>>> nian=raw_input("year: ")[3]
year: 2016
>>> nian
'6'
>>>

   2>分片

使用索引我们可以访问序列中的单个元素,但是使用分片我们可以访问序列中一定范围内的元素。分片通过冒号隔开两个索引来实现。

分片操作对于提取序列的一部分很有用的。而编号在这里显得尤为重要。第一个索引是要提取的第1个元素的编号,也就是要提取范围的开始端,第二索引也就是第二个元素的编号,也就是提取范围的结束端,但是分片中包含开始端,不包含结束端。

>>> numbers=[1, 2, 3, 4, 5, 6, 7, 8, 9]   
>>> numbers[3:7]      /提取第四个元素到第7个元素之间的范围(4-8)但是不含8.
[4, 5, 6, 7]
>>> numbers[2:-1]    /-1索引表示最后一个元素,但是不包含
[3, 4, 5, 6, 7, 8]
>>>

    假设我们需要访问最后三个元素:

>>> numbers[6:9]  /索引6表示第7个元素,但是索引9表示第10个元素,这个元素并不存在,但是不包含在内。
[7, 8, 9]
>>> 

>>> numbers[-3: ]   /还可以这样,-3表示倒数第三个元素,一直到结尾。
[7, 8, 9]
>>>

    访问前三个元素:

>>> numbers[0:3]
[1, 2, 3]
>>> numbers[ :3]
[1, 2, 3]
>>>

    复制整个序列:

>>> numbers[ : ]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

    如果在分片中,左边的元素比右边的元素晚出现在序列中,那么就会成为一个空序列。

>>> numbers[6:2]
[]
>>>

    更大的步长。进行分片的时候,分片开始和结束的标志需要进行指定,而另一个参数——步长——通常都是隐式设定的。在普通的分片中步长是1,分片操作就是按照这个步长遍历整个序列元素的。

>>> numbers[0:5]
[1, 2, 3, 4, 5]
>>> numbers[0:5:2]
[1, 3, 5]
>>> numbers[5:0:-2]    /步长也可以是负数,表示从右到左提取元素。
[6, 4, 2]
>>>

    3>序列相加

>>> [1, 2, 3] + [1, 5, 6]
[1, 2, 3, 1, 5, 6]
>>> "hello" + "world"
'helloworld'
>>> [1, 2, 3] + "world"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
>>>

列表和字符串是无法连接在一起的,尽管他们都是序列。简单来说,两种相同类型的序列才能进行连接操作。

    4>乘法

用数字乘以一个序列会生成新的序列,而在新的序列中,原来的序列会被重复n次。

>>> "python" * 5
'pythonpythonpythonpythonpython'
>>> [34] *5
[34, 34, 34, 34, 34]
>>>

空列表可以简单的用两个中括号([])来表示,但是若我们想要创建占用10个元素空间的序列,这里可以直接使用None。None是一个python内建值,它的确切含意是“这里什么也没有”。

>>> sequence=[None] *10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
>>>

    检查一个值是否在序列中,可以使用in运算符,该运算符会返回一个值,结果为真返回True,否则返回false。

>>> numbers
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> '3' in numbers          /用单引号表示一个字符,所以返回假
False
>>> 3 in numbers            /数字表示返回真
True
>>>

    长度,最小值,最大值:

>>> len(numbers)
9
>>> max(numbers)
9
>>> min(numbers)
1
>>>

2.列表的方法:

    字符串不能像列表一样被修改,所以有时根据字符串创建列表会很有用。

>>> n=list("hello")
>>> n
['h', 'e', 'l', 'l', 'o']
>>>

list函数使用于所有类型的序列,而不只是字符串。

    基本的列表操作:

    1>改变列表的元素赋值:

>>> x=[1, 1, 1]
>>> x
[1, 1, 1]
>>> x[1]=2
>>> x[2]=3
>>> x
[1, 2, 3]
>>>

    2>删除元素可以使用del语句:

>>> del x[2]
>>> x
[1, 2]
>>>

    3>分片赋值:

>>> name=list("perl")
>>> name
['p', 'e', 'r', 'l']
>>> name[2: ]=list("Ar")
>>> name
['p', 'e', 'A', 'r']
>>>

    使用分分片赋值时可以使用与原序列不等长的序列将分片代换。

>>> name
['p', 'e', 'A', 'r']
>>> name[1: ]=list("ython")
>>> name
['p', 'y', 't', 'h', 'o', 'n']
>>>

    分片赋值还可以在不需要替换任何元素情况下插入新元素。

>>> numbers=[1, 5]
>>> numbers[1:1]=[2, 3, 4]
>>> numbers
[1, 2, 3, 4, 5]
>>>

    这个程序只是替换了以空的分片,因此实际操作是插入了一个序列。若我们把分片内的元素替换为空,则就可以达到删除的目的。

>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:3]=[]
>>> numbers
[1, 4, 5]
>>>

3.列表的方法:

    方法是一个与某些对象有紧密联系的函数,对象可能是列表,数字,也可能是字符串或者其他类型的对象。一般来说,方法可以这样调用。

对象.方法(参数)

    append方法用于在列表末尾增加新的对象:

>>> lst=[1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
>>>

注意:使用append时,它不是简单的返回一个修改过的新列表——而是直接修改原来的列表。

    count方法:统计某个元素在列表中出现的次数

>>> ["to", "be", "or", "not", "to", "be"].count('to')     /字符一定要带上引号
2
>>> ["to", "be", "or", "not", "to", "be"].count("to")
2

>>> x=[[1,2],1,1]
>>> x.count(1)
2
>>>

   extemd方法:在列表末尾一次性追加另一个序列中的多个值。换句话说,可以用新列表扩展原有的列表:

>>> a=[1, 2, 3]
>>> b=[4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
>>>

    extend方法:修改了被扩展的序列,而原始连接的操作则是返回一个全新的序列。

>>> b=[4, 5, 6]
>>> a
[1, 2, 3, 4, 5, 6]
>>> a+b
[1, 2, 3, 4, 5, 6, 4, 5, 6]
>>> a
[1, 2, 3, 4, 5, 6]
>>> b
[4, 5, 6]
>>>

    index方法。用于从列表中找出某个值第一匹配项的索引位置。

>>> n
['a', 'b', 'c', 'd', 'a']
>>> n.index("a")     /注意如果是字符的话,一定要加引号。
0