一,列表的基础操作:
1 empty = [] 2 list1 = ['jimei','ruanjian','2021','37'] 3 list1[1] = 100#修改元素 4 print(list1) 5 del list1[2]#删除元素 6 print(list1) 7 list1+=[100,110]#在原来列表的基础上再加上一个列表 8 list1.append(200)#在末尾添加元素
这里还是比较简单没啥好说的基本操作
1 a = ['a','b','c'] 2 n = [1,2,3] 3 x = [a,n] 4 a[0] = 1 5 print(x) 6 print(x[0]) 7 print(x[0][1])
这个x其实就是两个列表的合并,x[0]其实就是a,这个其实和c语言里二维数组访问是一样的。
1 b = a = [2,1] 2 a+=3 3 print(a,b) 4 a = a+[4,5] 5 print(a) 6 print(b)
一开始的赋值就是b和a指向同一个地方,在a的位置添加元素就是把这个位置的值改变,b也会跟着改变。如果用+=的话就不会发生改变了。
除了加法之外列表肯定还存在乘法:
注意一下,虽然表现形式乘了相应的倍数,但是还是每一个指针是同一个位置,一改全改。
1 a = [1,2,3,4] 2 b = a[1:3] #从1到2 3 print (b) 4 b[0] = 100 5 print(b) 6 print(a) 7 print(a[::-1])#就相当于反过来打印,最后一个-1的意思是步长为-1 8 print([1,2,3,4,5,6][1:5:2])#从1到4步长为2 9 print(a[:])#就是从头到尾遍历
二,列表的排序:
1 def selectsort(a): 2 n = n = len(a) 3 for i in range(n-1): 4 for j in range(i+1,n): 5 if a[j]<a[i]: 6 a[i],a[j] = a[j],a[i] 7 lst = [1,12,44,56,6,2] 8 selectsort(lst) 9 print(lst)
上面是py的选择排序,其实思路和之前的c语言是一样的只是表示形式不一样 。但是py提供了很多标准库中的排序函数供我们使用。
1 a = [5,7,6,3,4,1,2] 2 a.sort() 3 print(a) 4 a = [5,7,6,3,4,1,2] 5 b = sorted(a) 6 print(a) 7 print(b) 8 a.sort(reverse = True) #对a从大到小排序 9 print(a)
要解释的其实就是第八行了,这个涉及到后面自定义排序,这个reverse其实就有点像一个函数,这个函数的返回值是True的话就可以使sort进行反转。如果是元组或者是列表作为列表中的元素就是按照列表中元素排列的先后来进行排序。
自定义比较规则的排序常常是用于比较复杂。
1 def mykey(x): 2 return x%10 3 a = [25,7,16,33,41,1,2] 4 a.sort(key = mykey) 5 print(a) 6 b = sorted("This is a test string from Andrew".split(),key = str.lower) 7 print(b)
比如说上面的代码,我定义了一个函数会返回一个数的个位上的数,key的作用就是把a中的所有元素作为参数传入mykey中返回个位上的数,最后这个sort就是按照个位上的数的大小进行排序的了。b就是把这个字符串作为列表的形式储存(split的作用),然后不区分大小写排序(就是把所有元素全部转成小写了)。
1 students = [('john','A',15),('Mike','B',12),('Mike','C',18)] 2 students.sort(key = lambda x: x[2])#按照年龄排序 3 students.sort(key = lambda x :x[0])#按照姓名排序
不同的关键字排序,会有不一样的排序效果。后面就是来说说上面用到的lambda表达式的作用。
其实就是一个简单函数的写法咯,把4和5作为参数传进去之后返回冒号后面的值。
这个就是自定义排序了。这个其实就是排序的选择先后问题。-x[2]的意思就是按照年龄来从大到小排。但是如果不是列表的话,是元组,使用sort的结果是列表。
三,映射map容器的使用(c++也有所使用)以及列表过滤。
map(function,sequence),可用于将一个序列映射到另一个序列
返回一个延时求值对象,可以转换成list,tuple(元组),set等等
下面来举一个例子:
1 def f(x): 2 print(x,end = "") 3 return x*x 4 a = map(f,[1,2,3]) 5 print(list(a)) 6 print(tuple(a)) 7 a = list(map(lambda x:3*x,[2,3,4])) 8 print(a)
在我的理解里面,这个map说白了就是把后面的列表中的每一个元素作为参数传入f(x)中,最后返回的值储存起来赋给一个容器中(可以是列表,元组等),但是这个值并不是一种及时体现的,需要把这些值用一个容器装起来。
map还能够用于输入,如下:
1 x,y,z = map(int,input().split()) 2 print(x,y,z)
这个要稍微注意一下,int也是一个function,如int()可以把一个数据转成int型。后面就是把输入的x,y,z转成一个列表中的元素。
map还可以把多个序列映射到一个序列中,这个就是把各个序列的对应值全部加起来,然后放到x这个列表中去。
后面还有一个很酷的东西就是列表过滤。
这个过滤的确很方便,不需要去遍历删除。后面举一个栗子:
1 def f(x): 2 return x%2 == 0 3 lst = tuple(filter(f,[1,2,3,4,5,6])) 4 print(lst)
四,列表生成式:
后面先给一堆例子理解一下:
后面一个个解释一下把,其实总结起来就是函数放在for循环的前面,在for循环的后面可以继续加上for循环或者是if的判断语句。这里补充一下isinstance函数是用来判断是不是某个类型的数的。
六,二维列表:
其实和二维数组差不了太多的,但是可以看一下用列表生成式的二维列表生成
这个和c语言还是有比较大差别的。毕竟这个里面的函数会更多。但是二维元组的定义会麻烦一点,需要在表达式前面加上tuple,但是也可以理解,毕竟如果只有一个括号的话就会太苍白了。
七,列表的拷贝:
如果只是这样进行拷贝的话只是浅层的拷贝,需要进行深层的拷贝的话要连着指针一起拷贝,如果这样拷贝的话,a与b其实还是指向同一个位置的,这样如果改变a的值,b的值也会发生改变。所以这里就要引入一个库——copy。
引入deepcopy这个函数就能连同指针一起打印。
八,列表转化:
呼~,写了一大堆累死了。py的内容的确很杂,但是还是很酷的哈哈哈!