概要:
通用序列操作 (索引、分片、加、乘、迭代、成员资格)
列表的基本操作 (元素赋值、删除元素、分片赋值、列表方法)
列表方法:(append\count\extend\index\insert\pop\remove\reverse\sort\cmp)
方法是一个与某些对象有紧密联系的函数。对象可能是列表、数字、字符串或者其他类型的对象。
方法调用格式:对象.方法(参数)
数据结构是通过某种方式(例如对元素进行编号)组织在一起的数据元素的集合,这些数据元素可以是数字或者字符,甚至可以是其他数据结构。常见的数据结构有序列(sequence)和字典(dictionary)。
python中包含六种内建的序列:列表;元组;字符串;unicode字符串;buffer对象;xrange对象。
一、列表和元组
序列中的每个元素被分配一个序号(即元素的位置),也称索引。第一个索引是0,第二个是1,以此类推。也可以从最后一个元素开始计数(序列中的最后一个元素标记为-1,倒数第二个元素为-2,以此类推),好处:这样我们就可以从第一个元素向前或向后计数。
1、序列概览
列表和元组的区别:列表可以修改,元组不能修改。
在需要操作一组数值的时候,序列很好用。可以用序列表示数据库中一个人的信息:第一个元素是姓名,第二个元素是年龄。如下:(列表的各个元素通过逗号分割,写在方括号中)
>>> ls=['lisan',42]
>>> ls
['lisan', 42]
序列也可以包含其他的序列,因此构建如下的一个人员信息的列表也是可以的,这个列表就是数据库:
>>> ls=['lisan',42]
>>> zs=['zhangsi',50]
>>> database=[ls,zs] //database列表中的元素为列表时,元素不需要加引号。
>>> database
[['lisan', 42], ['zhangsi', 50]]
>>>
>>> [] //空列表,里面什么东西都没有
[]
>>>
>>> [None] //空列表占位符(python的内建值(表示这里什么也没有)),None的书写一定要正确。
[None]
>>>
注意:python中还有一种名为容器(container)的数据结构。容器基本上是包含其他对象的任意对象。序列(例如列表和元组)和映射(例如字典)是两类主要的容器。序列中的每个元素都有自己的编号,映射中的每个元素都有一个名字(也称为键值)。既不是序列也不是映射的容器类型,集合(set)就是一个例子。
2、通用序列操作 (索引、分片、加、乘、迭代、成员资格)
所有序列类型都可以进行某些特定的操作。这些操作包括:索引(indexing)、分片(sliceing)、加(adding)、乘(multiplying)、迭代(iteration)(迭代的意思是依次对序列中的每个元素重复执行某些操作)、检查某个元素是否属于序列的成员(成员资格)。除此之外,python还有计算序列长度、找出最大元素、最小元素的内建函数。
a)、索引
格式:sequence[索引值]
简单来说索引就是通过元素编号取序列中的元素值。
序列中的元素都是有编号的(从0开始递增),这些元素可以通过编号分别访问:
如:
>>> greeting='hello' //字符串就是一个由字符组成的序列。
>>> greeting[0]
'h'
>>> greeting[1]
'e'
>>> greeting[3]
'l'
>>> greeting[-1]
'o'
>>>
通过索引编号可以方便获取序列中的元素值。
注意:字符串字面值(就此而言,其他序列字面值也可以)能够直接使用索引,而不需要一个变量引用他们。两种做法是一样样的:
如:
>>> 'hello'[1]
'e'
>>> 'hello'[-1]
'o'
>>> ['lisi',32,'zhangsan',33][1]
32
>>> ['lisi',32,'zhangsan',33][0]
'lisi'
>>> ['lisi',32,'zhangsan',33][-1]
33
>>>
函数调用返回序列,可以直接对返回结果进行索引操作。
如:你只对用户输入的年份的第4个数字感兴趣,可以进行如下操作:
>>> fourth=input('year:')[3] //python3中
year:2016
>>> fourth
'6'
>>>
>>> fourth=input('year:')[3] //python2中,可以用raw_input函数替代
year:'2016'
>>> fourth
'6'
>>>
>>> fourth=raw_input ('year:')[3] //python2中
year:2016
>>> fourth
'6'
>>>
b)、分片
格式:sequence[分片起始值:分片结束值:步长] //包含分片起始值,不包含分片结束值;通常情况下步长默认为1,可以根据需要对步长进行更改,步长大于1时,会跳过某些元素值。
分片就是取序列中的一段元素值。
如:
>>> tag="i love u u love u "
>>>
>>> tag[0:-1] //不包含最后一个空格
'i love u u love u'
>>> tag[0:] //包含最后一个空格
'i love u u love u '
>>> tag[:] //包含最后一个空格 ,复制整个序列。
'i love u u love u '
>>> tag[:1]
'i'
>>>
>>> tag[1:6]
' love'
>>> tag[2:6]
'love'
>>> tag[-3:-1]
' u'
>>> tag[-4:-1]
'e u'
>>>
>>> tag[-4:0] //这样写的话会输出一个空序列,只要分片左边的索引比它右边的索引晚出现在序列 中,结果就是一个空序列。
''
>>>
>>> tag="i love u u love u "[1:5] //分片也支持赋值的字面取值
>>> tag
' lov'
>>>
>>> "i love u u love u "[1:5] //分片也支持字面取值
' lov'
>>>
>>> tag="i love u u love u "
>>> tag
'i love u u love u '
>>> tag[1:6:2] //步长更改为2
' oe'
>>> tag[0:6:2]
'ilv'
>>> tag[0::2] //不包含最后一个元素值,步长为2
'ilv oeu'
>>> tag[::2] //遍历整个序列元素,步长为2
'ilv oeu'
>>> tag[::3] //步长更改为3
'io uo '
>>>
>>> tag[::0] //步长不能为0,否则会报错,因为0的话,不会执行。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: slice step cannot be zero
>>>
>>> tag[::-1] //步长可以为负数,即从右向左提取元素值。
' u evol u u evol i'
>>> tag[::-2]
' vluueo '
>>>
>>> tag[0:-1]
'i love u u love u'
>>> tag[0:-1:2]
'ilv oeu'
>>> tag[0:-1:-1]
''
>>>
c)、序列相加
格式:sequence+sequence
通过使用加号(+)可以进行序列的连接操作:
注意:序列的相加需要相同类型的序列才可以操作。
如:
>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> a+b
[1, 2, 3, 4, 5, 6]
>>> "hello"+'world'
'helloworld'
>>> c='hello'
>>> d='world'
>>> c+d
'helloworld'
>>>
>>> [1,2,3]+'hello' // 不同类型的序列不能相加,否则会报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "str") to list
>>>
d)、乘法
格式:sequence*数字
用数字x乘以一个序列会生成新的序列,而在新的序列中,原来的序列将被重复x次。
>>> 'hello'*5
'hellohellohellohellohello'
>>> ['he','llo']*5
['he', 'llo', 'he', 'llo', 'he', 'llo', 'he', 'llo', 'he', 'llo']
>>> [1,2]*5
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2]
>>>
>>> [None]*10 //初始化一个空序列为10的列表。
[None, None, None, None, None, None, None, None, None, None]
e)、成员资格
格式:元素值 in sequence
成员资格是验证一个元素值是否在序列中,它是一个逻辑运算(布尔运算),如果元素在序列中就返回true,否则返回false。
如:
>>> 'i' in "i love u"
True
>>> a='ilovu'
>>> 'i' in a
True
>>> 'p' in a
False
>>> jg=input() in a
i
>>> jg
True
>>>
>>>
>>> 12 in [12,23,34,45]
True
>>> 120 in [12,23,34,45]
False
>>>
f)、长度、最小值、最大值
格式:内建函数len、min、max
len函数返回序列中所包含的元素的数量。
min函数返回序列中最小值。
max函数返回序列中最大值。
如:
>>> c[:]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> len(c)
8
>>>
>>> max(c)
8
>>> min(c)
1
>>>
>>> max(1,2,3,4,5) //这里的参数并不是一个序列,而是采用了多个数值直接作为参数。
5
>>>
3、列表:
列表是可变的,可以改变列表的内容。
3.1、list函数:
格式:list(‘字符串’)
由于字符串不能像列表一样被修改,所以有时根据字符串创建列表会很有用。而list函数可是实现此功能。当然list函数适用于所有类型的序列,不只是字符串
如:
>>> a=[1,2,3,4,5,6,7,8,9]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(a)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> st='helloworld'
>>> list(st)
['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'] //将字符串专程列表。
>>>
3.2、列表的基本操作 (元素赋值、删除元素、分片赋值、列表方法)
列表可以使用以上所有适用于序列的标准操作,例如:索引、分片、连接和乘法。但是列表是可以修改的,如:元素赋值、元素删除、分片赋值、列表方法(不是所有的列表方法都可以改变列表)
a)、元素赋值
格式:sequence[元素位置]=新值
需要使用索引标记来为某个特定的、位置明确的元素赋值,
如:
>>> x=[1,2,3]
>>> x[0]=10
>>> x
[10, 2, 3]
>>>
b)、删除元素
格式:del sequence[元素位置]
如:
>>> x
[10, 2, 3]
>>> del x[0]
>>> x
[2, 3]
>>>
c)、分片赋值
如:
>>> name='zhangsan'
>>> name=list('zhangsan')
>>> name
['z', 'h', 'a', 'n', 'g', 's', 'a', 'n']
>>> name[4:]=list('wuji') //修改元素值,并赋予新值
>>> name
['z', 'h', 'a', 'n', 'w', 'u', 'j', 'i']
>>>
>>> len(name)
8
>>> name[8:]=list('isgoodboy') //在name序列元素值后面加上新值。
>>> name
['z', 'h', 'a', 'n', 'w', 'u', 'j', 'i', 'i', 's', 'g', 'o', 'o', 'd', 'b', 'o', 'y']
>>>
>>> name[5:]=list('&lisi') //将name序列从第六个元素值开始替换。
>>> name
['z', 'h', 'a', 'n', 'w', '&', 'l', 'i', 's', 'i']
>>> name[4:4]=list('g&wangwu') //不替换原有值插入新值在name序列第四个元素后插入g&wangwu
>>> name
['z', 'h', 'a', 'n', 'g', '&', 'w', 'a', 'n', 'g', 'w', 'u', 'w', '&', 'l', 'i', 's', 'i']
>>> name[4:5]=list('123') //此处会替换掉值
>>> name
['z', 'h', 'a', 'n', '1', '2', '3', '&', 'w', 'a', 'n', 'g', 'w', 'u', 'w', '&', 'l', 'i', 's', 'i']
>>> name[4:]=[ ] //利用空虚列赋值
>>> name
['z', 'h', 'a', 'n']
>>>
备注:可以更改序列的步长或步长的正负值进行分片赋值。
>>> name
['z', 'l', 'o', 'v', 'e', 'w', 'u', 'j', 'i']
>>> del name[::2]
>>> name
['l', 'v', 'w', 'j']
>>>
>>> num[1:6:2]=[ ] //自行分析。
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: attempt to assign sequence of size 0 to extended slice of size 3
>>>
>>> num[1:6:2]=[11,12,13]
>>> num
[1, 11, 3, 12, 5, 13, 7, 8, 9]
>>>
3.3、列表方法:(append\count\extend\index\insert\pop\remove\reverse\sort\cmp)
方法是一个与某些对象有紧密联系的函数。对象可能是列表、数字、字符串或者其他类型的对象。
方法调用格式:对象.方法(参数)
a)、append:在列表末尾追加新的对象。它直接修改原来的列表。
和pop方法作用想反
如:
>>> lst=[1,2,3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
>>>
b)、count:统计每个元素在列表中出现的次数
如:
>>> a=lst*5
>>> a
[1, 2, 3, [4, 5, 6], 1, 2, 3, [4, 5, 6], 1, 2, 3, [4, 5, 6], 1, 2, 3, [4, 5, 6], 1, 2, 3, [4, 5, 6]]
>>> a[3]
[4, 5, 6]
>>> a[2]
3
>>> a[4]
1
>>> len(a)
20
>>> a.count([4,5,6])
5
>>> a.count(4)
0
>>> a.count(3)
5
c)、extend:在列表的末尾一次性追加另一个序列中的多个值(注意append只能追加一个对象)
可以和分片追加、列表“+”、作对比
如:
>>> a
[1, 2, 3]
>>> b=[4,5,6]
>>> a.extend(b) //a用extend追加b列表,b的值会扩展a的值后面。
>>> a
[1, 2, 3, 4, 5, 6]
>>> c=[7,8,9]
>>> c.append(b) //c用append方法追加一个列表b,b列表制作为一个元素值。
>>> c
[7, 8, 9, [4, 5, 6]]
>>>
d)、index:从列表中找出某个值第一个匹配项的索引位置。
如:
>>> d
[1, 2, 3, 4, 5, 6, 4, 5, 6, 4, 5, 6]
>>> d.index(5)
4
e)、insert:将对象插入到列表中。(也可以通过分片赋值来实现)
如:
>>> num=[1,2,3,4,5]
>>> num.insert(3,100) //(3,100)中的3代表插入的位置,100代表插入的值。
>>> num
[1, 2, 3, 100, 4, 5]
>>> num.insert(3,'100')
>>> num
[1, 2, 3, '100', 100, 4, 5]
>>>
f)、pop:移除列表中的一个元素(默认是最后一个),并且返回该元素的值。
和append方法作用相反。
如:
>>> num=[1,2,3,4,5,6,7,8]
>>> num.pop( )
8
>>> num
[1, 2, 3, 4, 5, 6, 7]
>>> num.pop(0)
1
>>> num
[2, 3, 4, 5, 6, 7]
>>> num.pop(1,2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: pop() takes at most 1 argument (3 given)
>>>
注意:使用pop方法可以实现一种常见的数据结构---栈。
栈的原理就像放盘子一样,最后放的最先拿出(LIFO,后进先出),栈有入栈(push放入盘子)和出栈(pop拿走盘子)。python没有入栈方法,但是可以使用append方法来代替,pop方法和append方法的操作结果恰好相反,如果入栈(或者追加)刚刚出栈的值,最后得到的结果还是原来的值。
如果需要实现一个先进先出(FIFO)的队列,可以使用insert(0,。。。)来代替append方法,或者也可以继续使用append方法,但是必须用pop(0)来代替pop()。当然更好的解决方案是使用collection模块中的deque对象。
g)、remove:移除列表中某个值的第一个匹配项。
>>> a
[2, 3, 4, 5, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6]
>>> a.remove(5)
>>> a
[2, 3, 4, 6, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6]
>>>
h)、reverse:将列表中的元素反向存放。
>>> a=[1,2,3,4,5]
>>> a.reverse( )
>>> a
[5, 4, 3, 2, 1]
>>>
>>> a=‘helloworld’ //reverse对字符串序列不适用。
File "<stdin>", line 1
a=‘helloworld’
^
SyntaxError: invalid syntax
>>> a='helloworld'
>>> a.reverse()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'reverse'
>>> a=['b','c','d','e','f','g'] //。。。。。。
>>> a.reverse()
>>> a
['g', 'f', 'e', 'd', 'c', 'b']
>>>
i)、sort:用于在原位置对列表进行排序。在“原位置排序”意味着改变原来的列表,从而让其中的元素能按照一定的顺序排列,而不是简单地返回一个已排列的列表副本。
如:
>>> x=[4,7,6,32,8] //对整数序列排序
>>> x.sort()
>>> x
[4, 6, 7, 8, 32]
>>> y=['a','i','c','r','f'] //对字符序列排序
>>> y.sort()
>>> y
['a', 'c', 'f', 'i', 'r']
>>> c='helloworld' //不能对字符串序列排序。
>>> c.sort()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'sort'
>>>
>>> x=[4,7,6,32,8]
需要一个排好序的列表副本,又保留原来的列表不变的问题解析
>>> x
[4, 7, 6, 32, 8]
>>> y=x.sort() //不能使用sort方法赋值给变量,因为sort方法修改了x却返回了空值。
>>> y
>>> print(y)
None
>>>
>>> x
[4, 6, 7, 8, 32]
要实现上述功能的做法:
方法一、
>>> x
[4, 7, 6, 32, 8]
>>> y=x[:] //1、将序列x所有元素赋给y;注意此处不能写成y=x,这样y、x都指向一个列表了。
>>> y
[4, 7, 6, 32, 8]
>>> y.sort() //2、用y进行序列排序
>>> y
[4, 6, 7, 8, 32]
>>> x
[4, 7, 6, 32, 8]
>>>
方法二、
>>> x
[4, 7, 6, 32, 8]
>>> y=sorted(x) //使用sorted函数来赋值
>>> x
[4, 7, 6, 32, 8]
>>> y
[4, 6, 7, 8, 32]
>>>
>>> sorted("hello") //sorted函数可用于任何序列,总返回一个列表,已经排好序的列表。
['e', 'h', 'l', 'l', 'o']
>>> sorted([13,27,4])
[4, 13, 27]
>>>
注意:如果想把一些元素按相反的顺序排列,可以先使用sort或者sorted进行排序,然后在使用reverse方法进行反向存放。
j)、cmp: (高级排序:) 注意:cmp方法只能用在python2.x版本中。
如果希望元素能够按照特定的方式进行排序(而不是像sort方法默认的方式),可以通过使用compare(x,y)的形式自定义比较函数。
compare(x,y)函数会在x<y时,返回负数;
compare(x,y)函数会在x>y时,返回正数;
compare(x,y)函数会在x=y时,返回0(根据自己定义);
,定义好compare函数后,可以提供给sort()方法作为参数
>>> cmp(33,44)
-1
>>> cmp(44,33)
1
>>> cmp(3,3)
0
>>>
>>> num=[3,2,6,4]
>>> num.sort(cmp)
>>> num
[2, 3, 4, 6]
>>>