列表作为有序数据类型。大部分操作和字符串类似。别如获取列表的元素;切片操作等。
1:索引(下标)
2:增、删、改、查
3:常用函数
4:列表解析
一:索引: 通字符串一样,从左到右。索引从0开始到len(list)-1结束。
从右到左,-len(list)到-1。
a=[1,2,3,4] print(a[0]) print(a[-1]) 1 4
二:1、列表增加一个元素。append()函数默认从最后加。insert(index,object)可以指定位置加入元素。
a=[1,2,3,4] b=[1,2,3,4] a.append(5) print(a) b.insert(b[0],0) print(b) [1, 2, 3, 4, 5] [1, 0, 2, 3, 4]
2:删除一个元素。用pop(index)默认删除最后一个元素。或者用remov(元素)函数。注意区别。
a=[1,2,3,4] b=[1,2,3,4] a.pop(2) print(a) b.remove(1) print(b) [1, 2, 4] [2, 3, 4] ################### a=[1,2,3,4,6,6,7,7,23,23,23,5]#del可以删除任何内存中的数据,变量等。 del a[2:4] print(a) [1, 2, 6, 6, 7, 7, 23, 23, 23, 5]
练习:如何删除一个列表中重复的元素?
a=[1,2,3,4,6,6,7,7,23,23,23,5] Num=a.count(23) for i in range(Num): a.remove(23) print(a) [1, 2, 3, 4, 6, 6, 7, 7, 5]
通过count()函数获取23元素出现次数。作为for循环的次数。进而删除重复出现23元素。
三:列表解析:
列表解析:
语法:[expr for iter_var in iterable] 或 [expr for iter_var in iterable if cond_expr]
这个好处是避免写冗长的代码来获取列表。
列表解析是比较早的Python版本里就引进的(好像是2.0版本),而生成器表达式则是在2.4中引入的新内容,它和列表解析的语法很像,但是在大数据量处理时,生成器表达式的优势就体现出来了,因为它的内存使用方式更好,效率更高,它并不创建一个列表,只是返回一个生成器。
1) list_a=[1,2,3,4,4] list_b=[3,4] list_contiain=[i for i in list_a if i in list_b] print(list_contiain) [3, 4, 4] 2) a=[x for x in range(3)] print(a) [0, 1, 2]
四:列表的合并,用函数extend()
a=[x for x in range(3)] b=[i for i in range(2)] a.extend(b) print(a) [0, 1, 2, 0, 1]
五:列表的深浅拷贝,用函数copy()
a=[1,2,3,4,[1,2]] b=list(a) c=a[:] b[4][0]=55 print(a,b,c) [1, 2, 3, 4, [55, 2]] [1, 2, 3, 4, [55, 2]] [1, 2, 3, 4, [55, 2]] ############################### a=[1,2,3,4,[1,2]] c=a.copy() c[4][0]='t' print(a,c) [1, 2, 3, 4, ['t', 2]] [1, 2, 3, 4, ['t', 2]] ####################################### import copy a=[1,2,3,[1,2]] c=copy.copy(a) c[3][1]='fuck' print(a,c) [1, 2, 3, [1, 'fuck']] [1, 2, 3, [1, 'fuck']] ###########深拷贝###################### import copy a=[1,2,3,[1,2]] c=copy.deepcopy(a) c[3][1]='fuck' print(a,c) [1, 2, 3, [1, 2]] [1, 2, 3, [1, 'fuck']]
思路一:利用切片操作和工厂方法list方法拷贝就叫浅拷贝,只是拷贝了最外围的对象本身,内部的元素都只是拷贝了一个引用而已。
思路二:利用copy中的deepcopy方法进行拷贝就叫做深拷贝,外围和内部元素都进行了拷贝对象本身,而不是引用。
但是对于数字,字符串和其他原子类型对象等,没有被拷贝的说法,即便是用深拷贝,查看id的话也是一样的,如果对其重新赋值,也只是新创建一个对象,替换掉旧的而已。