1.介绍
在python中,list称为列表,和java中的集合很相似,是一个可变的数组容器,但是python中的list不需要提前进行申明,也可以存储不是同一种数据类型的值,也可以进行列表嵌套列表。
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。如下所示
list1=list() #利用list()的工厂函数创建一个空的列表list2=['a','b','c','d','e'] #创建一个字符列表
list3=[0,1,2,3,4] #创建一个整数列表
list4=['a',1,2,'b'] #创建一个有字符有整数的列表
list5=[1,2,[3,4],[5,6],[7,[8,9]]] #创建一个列表中包含列表,值的类型也可以不一致
列表中的每个元素都分配一个索引(位置),第一个索引是0,第二个索引是1,依此类推。
当索引为负数时,最后一个元素的索引为-1.倒数第二个元素的索引为-2,依此类推。
我们可以用list_name[index]来取出列表中的元素,例如list2[0],list3[1],对应的就是字符'a',1。当时当我们索引不存在的元素是,就会出现异常(exception)。例如输出list3[5],此时会出现IndexError的异常,因为从上面我们可以看出,这个list3列表只有5个元素,他的最大索引为4,索引为5的元素是不存在的。
2.方法
增:
list_name.insert(index,obj) 此方法为在指定的index位置上插入一个obj,无返回值,当插入的位置不存在,负数为在负数索引左边插入,正数为在尾部插入
list_name.append(obj) 此方法为在尾部的位置插入一个obj,无返回值
list_name.extend(seq)此方法为用另外一个序列(列表或者元组)去扩充原列表,无返回值
>>>list1=['a','b','c','d'] #先创建一个list1列表
>>>list1.insert(0,'h') #在索引为0的位置插入'h',无返回值。 当插入的位置为-1时,应该是在-1索引的值'd'的左边插入进去,当插入位置为5,即插入尾部>>>list1 #打印出新的列表list1
['h','a','b','c','d'] #结果显示
>>>list1.append('g') #在列表的尾部插入'g',无返回值
>>>list1 #打印出新的列表list1
['h','a','b','c','d','g']#结果显示
>>>list1.extend([1,2]) #在新列表扩充原有列表,无返回值
>>>list1#打印出新的列表list1
['h','a','b','c','d','g',1,2] #结果显示
删:
del list_name[index] 此方法为移除指定索引的对象,无返回值,对象不存在则报IndexError
list_name.remove(obj) 此方法为移除一个指定的对象,无返回值,对象不存在则报ValueError
list_name.pop(index=-1) 此方法为移除指定索引的对象,索引默认为-1即尾部的那个对象,返回被移除的对象,索引不存在则报IndexError。
>>>list1=['a','b','c','d','e'] #创建一个list列表
>>>list1.remove('c') #移除对象'c'
>>>list1
['a','b','d','e']>>>list1.pop() #弹出list1列表中的最后一个元素,即'e'
'e'
>>>list1
['a','b','d']>>>list1.pop(2) #弹出list1列表中索引为2的元素
'd'
>>>list1
['a','b']
改:
对于修改列表中的元素,利用列表的索引找到元素,直接赋值即可
>>>list1=['a','b','c','d'] #创建一个列表
>>>list1[1]='q' #修改索引为1的元素,改为'q'
>>>list1
['a','q','c','d']
查:
对于查找列表中的元素,利用列表的索引找到元素,即可,或者使用list_name.index(obj)查找obj出现的第一次索引位置,并返回
>>>list1=['a','b','c','d','b'] #创建一个新列表
>>>list1[0] #查找索引为0的元素
'a' #输出结果
>>>list1.index('b') #输出'b'出现的第一次位置
1
其他:
排序:list_name.sort(key=None,reverse=False)
对列表里面的元素进行排序,无返回值,但是改变其内部结构。有2个可选参数,key指定一个函数,按照函数进行排序;另外一个是指定是否需要降序。当列表里面的数据类型不一致,在 Python3.x中排序会抛出TypeError,Python2.x不会。如果不想改变原有列表的内部结构,需要用列表切片或者用sorted()函数。(这里不介绍对象的排序,后面会介绍)
>>>list1=['av','ac','ada','qwe','rges','sfgh','awewra','bnhjn'] #创建一个字符串列表
>>>list1.sort() #对list1进行了排序,没有返回值,但是此时list1列表的内部结构已经发生改变,因为被排序了,按照字母在ascii码表的值大小排序
>>>list1
['ac','ada','av','awewra','bnhjn','qwe','rges','sfgh']
>>>list1.sort(reverse=True) #此时用降序的结构对list1进行排序,不是调用一次反转一次,而是只要变成了按照ascii码表的降序即完成排序
['sfgh','rges','qwe','bnhjn','awewra','av','ada','ac'] #已经完成降序的排序,即使再多次调用前面那个语句,结果也是一样的,不发生任何变化
>>>list1.sort(key=len) #通过函数进行排序,函数为长度,即按照每个元素的长度进行排序
['ac','av','ada','qwe','rges','sfgh','bnhjn','awewra']
# sort() 这个函数会改变列表的内部结构,如果我们不想改变列表的内部结构,就需要用切片或者sorted()函数了
>>>list2=['a','ab','ed','cfs','apk']
>>>list2[1:] #列表切片,拷贝一个副本,副本是原列表索引1开始到结束(包含索引1)
['ab','ed','cfs','apk'] #这个为列表的切片副本,但是没有赋值名字
>>>list3=list2[1:] #列表切片,拷贝一个副本,副本是原列表索引1开始到结束(包含索引1),并把这个副本赋值给list3列表
>>>list3
['ab','ed','cfs','apk'] #生成了一个新的列表
>>>list4=list2[:3] #列表切片,拷贝一个副本,副本是原列表开始到索引为3结束(不包含索引3),并把这个副本赋值给list4列表
>>>list4
['a','ab','ed'] #生成了一个新的列表
>>>list5=list2[:] #列表切片,拷贝一个副本,副本和原列表一模一样,并把这个副本赋值给list5列表
### 切片和直接赋值的区别###
>>>list1=['a','ab','ed'] #创建了一个列表对象,并生成一个list1的标签指向这个列表对象
>>>list2=list1[:] #拷贝了列表list1去生成一个新的列表对象,然后生成另外一个标签list2去指向新拷贝得到的列表,此时有2个标签,他们指向各自的对象,虽然对象里面的元素一样
>>>list3=list1 #生成一个list3标签,并且此标签页指向list1这个列表对象,所以此时有2个标签,但是只是指向同一个对象,修改了list1,list3会跟着变化的,而切片的则不会
###
>>>list1=['e','a','f','c'] #创建一个新列表
>>>sorted(list1) #sorted()函数返回了原列表排序后生成的新列表
['a','c','e','f']
>>>list2=sorted(list1) #通过sorted()函数对list1排序,返回的新列表赋值给list2,list1列表的内部结构没发生变化,而新的list2则为list1排序后的列表
>>>list3=list1.sort() #这样赋值是错误的,因为sort()这个函数不返回任何值,所以list3为None,因为在Python中,函数没有返回值的时候,都会返回一个None类型
反转列表:lise_name.reverse() 无返回值,但是列表内部结构已经改变
统计元素出现的次数:list_name.count(obj) 返回统计的次数
最大值、最小值:max(list_name) 、min(list_name) 非同一类型的列表,取最大或者最小,抛出TypeError
将序列转化为列表:list(seq)
统计列表长度:len(list_name) 返回列表长度
注:对比函数cmp(list1,list2)在Python3中已经删除,在Python2可以使用
3.迭代
列表中常见的迭代就是for循环,while循环也可以,但是很少使用。
>>>list1=['a','b','c','d','e']
>>>for each in list1:
print(each)
>>>count=0
>>>while count
print(list1[count])
count+=1