Python基础教程2c–数据类型-list(列表)

原文链接: http://www.juzicode.com/archives/274

1 list定义

List如其名,“清单,列表”,是一种顺序结构的数据类型,定义一个空列表的方法用英文中括号:

变量名=[]
l = []

定义一个包含了多个元素的列表在中括号中用逗号分隔开各个元素:

源码print(‘\n定义list类型:’)
l1 = [1,2,3,4] #定义了一个包含4个整型数据的列表
l2 = [1.1,2.2,3.3,4.4,5.5] #定义一个包含5个浮点数据的列表
l3 =[‘www’,’juzicode’,’com’] #定义一个包含了3个字符串数据的列表print(‘l1:’,l1)
print(‘l2:’,l2)
print(‘l3:’,l3)
结果定义list类型:
l1: [1, 2, 3, 4]
l2: [1.1, 2.2, 3.3, 4.4, 5.5]
l3: [‘www’, ‘juzicode’, ‘com’]

前面的定义中列表元素都是同一种数据类型,也可以定义包含了多种数据类型的列表:

源码print(‘\n定义list类型包含多类型元素:’)
l1 = [1,2.2,’juzicode.com’] #定义了一个包含3个混合元素的列表
print(‘l1:’,l1) 
结果定义list类型包含多类型元素:
l1: [1, 2.2, ‘juzicode.com’]

定义list的时候,list中还可以嵌套list:

源码print(‘\n定义list类型包含多类型元素和列表的列表:’)
l1 = [1,2.2,’juzicode.com’,[1,2,3]] #定义了一个包含3个混合元素加一个列表的列表
print(‘l1:’,l1)
结果定义list类型包含多类型元素和列表的列表:
l1: [1, 2.2, ‘juzicode.com’, [1, 2, 3]]

在后面学习了元组,字典,集合之后,你也可以尝试在list中包含这些数据类型。

计算list长度

计算list长度就是计算list中包含元素的个数,使用的函数为len(),和计算字符串长度的函数是一样。

源码print(‘\n计算list长度:’)
l1 = [1,2,3,4] #定义了一个包含4个整型数据的列表
l2 = [1.1,2.2,3.3,4.4,5.5] #定义一个包含5个浮点数据的列表
l3 =[‘www’,’juzicode’,’com’] #定义一个包含了3个字符串数据的列表print(‘l1:’,l1)
print(‘l2:’,l2)
print(‘l3:’,l3)
print(‘l1长度:’,len(l1))
print(‘l2长度:’,len(l2))
print(‘l3长度:’,len(l3))
结果计算list长度:
l1: [1, 2, 3, 4]
l2: [1.1, 2.2, 3.3, 4.4, 5.5]
l3: [‘www’, ‘juzicode’, ‘com’]
l1长度: 4
l2长度: 5
l3长度: 3

从上面的例程可以看出len()函数计算的是list元素的个数,在字符串list中并不是获取到这3个字符串元素的总字符个数。

【实验】思考并动手实验下,l1 = [1,2.2,’juzicode.com’,[1,2,3]] 这种list中包含list,像这个list长度会是多少,计算出来的长度是否会将list内部的list拆分出来呢?

索引-使用list元素

因为list是一种有序储存的数据类型,可以像字符串那样根据下标索引查找元素,其下标是从0开始编号的,比如l1 = [1,2.2,’juzicode.com’,[1,2,3]]这个list,其第0个元素l1[0]是1,第1个元素是2.2,第2个元素是’juzicode.com’,第3个元素是[1,2,3],可以这么使用:

源码print(‘\n下标索引使用list:’)
l1 = [1,2.2,’juzicode.com’,[1,2,3]] #定义了一个包含3个混合元素加一个列表的列表print(‘l1:’,l1)
print(‘l1[0]:’,l1[0])
print(‘l1[1]:’,l1[1])
print(‘l1[2]:’,l1[2])
print(‘l1[3]:’,l1[3]) 
结果下标索引使用list:
l1: [1, 2.2, ‘juzicode.com’, [1, 2, 3]]
l1[0]: 1
l1[1]: 2.2
l1[2]: juzicode.com
l1[3]: [1, 2, 3]

如果索引值大于其长度,将会出现IndexError错误,提示索引值超出了范围:

list的索引值也可以类似字符串,使用负数索引值,-1表示最后一个元素,以此类推:

源码print(‘\n负值下标索引使用list:’)
l1 = [1,2.2,’juzicode.com’,[1,2,3]] #定义了一个包含3个混合元素加一个列表的列表
print(‘l1:’,l1)
print(‘l1[-1]:’,l1[-1])
print(‘l1[-2]:’,l1[-2])
print(‘l1[-3]:’,l1[-3])
print(‘l1[-4]:’,l1[-4])
结果负值下标索引使用list:
l1: [1, 2.2, ‘juzicode.com’, [1, 2, 3]]
l1[-1]: [1, 2, 3]
l1[-2]: juzicode.com
l1[-3]: 2.2
l1[-4]: 1

添加元素–append

使用append()函数在list中添加元素,这个元素作为整体添加到list中:

源码print(‘\nlist添加元素:’)
l1 = [1,2.2,’juzicode.com’,[1,2,3]]  
print(‘l1:’,l1)
l1.append(‘www’)
print(‘l1:’,l1)
结果list添加元素:
l1: [1, 2.2, ‘juzicode.com’, [1, 2, 3]]
l1: [1, 2.2, ‘juzicode.com’, [1, 2, 3], ‘www’]  #添加后’www’作为一个整体添加到了list中

添加元素–extend

使用extend()函数在list中添加元素时,会将被添加对象拆分后添加进list中,下面的例子对比了append和extend的差异,extend将[4,5,6]这个list拆分成了3个元素后再添加到原来的list中,而append则是直接将[4,5,6]作为一个整体添加到了list中:

源码print(‘\nlist添加元素-extend:’)
l1 = [1,2,3] print(‘l1:’,l1)
l1.append([4,5,6])
print(‘l1经过append后:’,l1)
 l2 = [1,2,3] print(‘l2:’,l2)
l2.extend([4,5,6])
print(‘l2经过extend后:’,l2)
结果list添加元素-extend:
l1: [1, 2, 3]
l1经过append后: [1, 2, 3, [4, 5, 6]]
l2: [1, 2, 3]
l2经过extend后: [1, 2, 3, 4, 5, 6]

extend()函数对传入的参数类型是有要求的,类型必须是可以迭代的类型,不然会出现TypeError,单个的整数,浮点数这些数据是不可以迭代的,而字符串list,tuple,set,dict等是可以迭代的。下面的例子就是extend了一个整数类型的数据抛出的异常:

【实验】聪明的你实验下往一个列表里extend和append 一个字符串,会有什么不一样的效果?

切片

List的切片和字符串的切片使用方法是一样的,请参考http://www.juzicode.com/archives/182 中字符串切片的内容:

源码print(‘\nlist切片:’)
l2 = [0,1,2,3,4,5,6,7,8,9,10]
print(‘l2:’,l2)
print(‘l2[5:8]:’,l2[5:8])
结果list切片:
l2: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
l2[5:8]: [5, 6, 7]

7 逆序排列

方法1:使用list内置的reverse()方法,会导致list本身发生改变:

>>> a.reverse()
>>> a
[5, 4, 3, 2, 1]

方式2:使用切片方法,切片实际上是可以带3个参数的,三个参数的具体含义是[start:end:step],start,end不填写,step用-1,得到的就是一个逆序排列的list,这种情况下,list本身是不会变化的,这点和reverse()方法是有差异的。

>>> a = [1,2,3,4,5]
>>> a[::-1]
[5, 4, 3, 2, 1]

8 获取特定元素索引

使用list内置的index()函数查找某个元素第一次出现的位置,如果存在返回这个元素所在的位置,如果不存在将会抛异常。

>>> lst = [1,2,3,1,2,3,1]
>>> lst.index(1)
0     #元素1第一次在位置0出现,返回第一次出现的位置
>>> lst.index(5)
Traceback (most recent call last):   #元素5不存在,抛异常  
File “<stdin>”, line 1, in <module>ValueError: 5 is not in list

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注