列表与元组的主要不同在于,列表是可以修改的,元组不可以。列表适用于需要中途添加元素的情形,元组适用于出于某种考虑禁止修改序列的情形。在需要处理一系列值时,序列很有用,在数据库中,你可能使用序列来表示人,其中第一个表示姓名,第二个表示年龄。用列表表示如下:
1 | user = [ 'Andy' , 20 ] |
序列还可包含其他序列
user = [ 'Andy' , 20 ] use = [ 'john' , 21 ] database = [user,usr] database [[ 'Andy' , 20 ], [ 'john' , 21 ]] data = [ 'Aurora' ,user] data [ 'Aurora' , [ 'Andy' , 20 ]] |
有几种操作使用于所有序列,包括索引、切片、相加、相乘和成员检查。另外还有一些内置函数,可用于确定序列的长度以及找出序列中最大和最小的元素。
索引:
序列中所有的元素都有编号-从0开始递增
1234 | set = 'Hello' set [ 0 ] 'H' 字符串就是由字符组成的序列,索引 0 指向第一个元素,这里为字母H,不同于其他一些语言,python没有表示字符的类型。因此一个字符就是只包含一个元素的字符串。 |
这称为索引,还可使用负索引来获取元素
12 | set [ - 1 ] 'o' |
对于字符串字面量(以及其他序列字面量)可直接对其执行索引操作,无需先将其赋给变量,这与先赋给变量在对变量执行索引操作的效果一样。
12 | 'Hello' [ 1 ] 'e' |
如果函数调用返回一个序列,可直接对其执行索引操作。例如,你只想获取用户输入的姓名第二位:
name = input ( 'name: ' )[ 2 ] name: john name 'h' |
切片:
使用索引来访问单个元素外,还可使用切片来访问特定范围内的元素,使用两个索引用冒号分隔:
tag = '<a href="How long have you been studying python">python web site</a>' tag[ 9 : 30 ] 'How long have you bee' tag[ 49 : - 4 ] 'python web site' |
切片适用于提取序列一部分,其中的编号非常重要,第一个索引是包含第一个元素的编号,第二个索引是切片后前一位的元素编号(下标从0开始)
number = [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] number[ 3 : 6 ] [ 4 , 5 , 6 ] |
两个索引来指定切片的边界,其中一个索引指定的元素包含在切片内,第二个索引指定的元素不包含在切片内。
简写:
# 如果切片结束与序列末尾,可省略第二个索引: number[ - 3 :] [ 8 , 9 , 10 ] # 如果切片始于序列开头,可省略第一个索引: number[: 3 ] [ 1 , 2 , 3 ] # 复制序列 number[:] [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] |
步长:
执行切片操作时,显示或隐示地制定起点和终点,但通常省略另一个参数,即步长。在普通切片中,步长为1(从一个元素移动到下一个元素),切片包含起点和终点之间的所有元素。
1234 | number[ 0 : 10 : 1 ] [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] number[ 0 : 10 : 2 ] [ 1 , 3 , 5 , 7 , 9 ] |
也可以简写:
12 | number[:: 4 ] [ 1 , 5 , 9 ] |
步长不能为0,但是可以是负数,这样获取元素的位置是从右向左。
12 | number[:: - 2 ] [ 10 , 8 , 6 , 4 , 2 ] |
步长为正数时,它从起点移到终点,步长为负数时,它从终点移到起点。
序列相加:
[ 1 , 2 , 3 ] + [ 4 , 5 , 6 ] [ 1 , 2 , 3 , 4 , 5 , 6 ] [ 1 , 2 , 3 ] + 'world' Traceback (most recent call last): File "<pyshell#12>" , line 1 , in <module> [ 1 , 2 , 3 ] + 'world' TypeError: can only concatenate list ( not "str" ) to list |
不能拼接序列与字符串,虽然他们都是序列,一般不能拼接不同类型的序列。
乘法:
'hello' * 2 'hellohello' [ 2 ] * 3 [ 2 , 2 , 2 ] |
如先定义序列但并不为其赋值可用
name = [ None ] * 5 name [ None , None , None , None , None ] |
成员资格:
检查特定的值是否包含在序列中,使用in.满足条件返回true,否则返回false.
name = 'Andy' 'A' in name True # 对于字符串来说只有它包含的字符才是其成员或元素。 'p' in 'python' True |
长度、最小值、最大值
number = [ 100 , 20 , 80 ] len (number) 3 max (number) 100 min (number) 20 max ( 2 , 3 , 7 ) 7 |
列表常用方法
#赋值 x = [1,2,1] x[1]= 3 x [1, 3, 1] # 删除元素 x = [1,3,1] del x[1] x [1, 1] # 给切片赋值 name=list( 'Perl' ) name [ 'P' , 'e' , 'r' , 'l' ] name[3:]=list( 'ar' ) name [ 'P' , 'e' , 'r' , 'a' , 'r' ] # 还可以在不删除原有元素的情况下插入新元素 name[1:1]=list( 'el' ) name [ 'P' , 'r' , 'l' , 'e' , 'r' , 'a' , 'r' ] del name[1::2] name [ 'P' , 'l' , 'r' , 'r' ] |
方法是与对象(列表、数、字符串等)联系紧密的函数。
# 在末尾追加元素:append number.append(4) number [1, 2, 3, 4] # 清空列表:clear number.clear() number [] # 复制:copy a = [1,2,3] b = a b[1]=4 b [1, 4, 3] a [1, 4, 3] a = [1,4,3] b=a.copy() b[1]=5 a [1, 4, 3] # 计数:count [ 'to' , 'be' , 'or' , 'not' , 'to' , 'be' ].count( 'to' ) 2 x=[[1,2],1,2,[1,2,[2,1]]] x.count(1) 1 # 扩展追加exend a =[1,2,3] b= [4,5,6] a.extend(b) a [1, 2, 3, 4, 5, 6] b [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] # 查找第一次在序列中出现的索引 a =[ 'to' , 'be' , 'or' , 'not' , 'to' , 'be' ] a. index ( 'be' ) 1 a[1] 'be' # inster:插入 number = [1,2,3,4,5] number.insert(2,8) number [1, 2, 8, 3, 4, 5] # pop删除末尾最后一个元素并返回删除元素,pop是唯一既修改列表又返回一个非none值的列表方法。 number. pop () 5 number [1, 2, 8, 3, 4] number.insert(0,number. pop (0)) # 删除第一个指定值的元素 a =[ 'to' , 'be' , 'or' , 'not' , 'to' , 'be' ] a.remove( 'to' ) a [ 'be' , 'or' , 'not' , 'to' , 'be' ] # 倒序排列:reverse number = [2,8,3,4] number. reverse () number [4, 3, 8, 2] # 对列表就地排序指对原表进行修改:sort number = [4,3,8,2] number. sort () number [2, 3, 4, 8] |
元组:不可修改的序列
元组的几种写法。
(1,2,3) 1,2,3 (2,) 2, |
3 * (20+2) 66 3* (20+2,) (22, 22, 22) (22)与22完全等效,加上逗号,就能完全改变表达式的值 |
函数tuple的工作原理与list很像,它将一个序列作为参数,并将其转换为元组。如果参数是元组,就原封不动的返回。
tuple([1,2,3]) (1,2,3) tuple( 'abc' ) ( 'a' , 'b' , 'c' ) tuple((1,2,3)) (1,2,3) x = 1,2,3 x[1] 2 x[0:2] (1,2) |