列表是什么?
list是Python中的基本数据结构之一,属于可变序列,所以前文中讲的可变序列的通用操作都适用于list。
这一节讲列表的特性吧。
特性一:
列表是包含任意对象的有序集合,同一个列表中可以放不同的对象。
1 >>> #生成一个列表,里边多放几种对象 2 ... l = [3,‘你好‘,(7,8,9),[4,5],lambda x:x*x,{4:‘s‘}] 3 >>> l 4 [3, ‘你好‘, (7, 8, 9), [4, 5], <function <lambda> at 0x00000228B989D268>, {4: ‘s‘}] 5 >>> 6 7 #目前l列表中已经存在多种数据类型,还可以向其中加入别的数据类型的数据,如向列表末尾加入range(3) 8 9 >>> l.append(range(3)) 10 >>> l 11 [3, ‘你好‘, (7, 8, 9), [4, 5], <function <lambda> at 0x00000228B989D268>, {4: ‘s‘}, range(0, 3)] 12 >>> 13 14 # l中能能放的数据类型还有其他种类
特性二:
可以通过位置偏移,下标索引的方式方位列表中的元素。下标是从0开始的,倒过来是从-1开始的,这也是索引访问的一个特性。也可以访问某一范围之内的数值(切片)。
1 >>> #通过下标索引方式访问列表中的元素 2 >>> l = list(range(5)) 3 >>> l[2] 4 2 5 >>> 6 >>> #通过下标倒着取元素 7 >>> l[-1] 8 4 9 >>> l 10 [0, 1, 2, 3, 4] 11 >>> #可见,列表的索引倒着是从-1开始的,这点要注意 12 >>> 13 >>> #用切片的方式访问列表中的元素 14 >>> l[2,4] 15 Traceback (most recent call last): 16 File "<pyshell#11>", line 1, in <module> 17 l[2,4] 18 TypeError: list indices must be integers or slices, not tuple 19 >>> l[2:3] 20 [2] 21 >>> l[1:4] 22 [1, 2, 3] 23 >>> l[-1:-3] #这个例子就说明了即使是倒着取元素,切片的范围也是左小右大 24 [] 25 >>> l[-3:-1] 26 [2, 3] 27 >>>
特性三:
列表可变长度,异质并且可互相嵌套。
1 >>> #列表的可变长度表现在可以改变列表元素的数据量,具体实现方法包括append()、insert()、remove()、extend()、pop()、* 等 这几个函数的用法在前文中已经介绍,不再赘述 2 >>> #说说列表异质这个特性吧,说的就是列表中的数据类型可以是可以是任意的数据类型 3 >>> #互相嵌套说的是啥呢,简单来说列表的元素可以是一个列表,举个栗子 4 >>> l = list(1,[2,4]) 5 Traceback (most recent call last): 6 File "<pyshell#22>", line 1, in <module> 7 l = list(1,[2,4]) 8 TypeError: list() takes at most 1 argument (2 given) 9 >>> 10 >>> l=[1,2,[3,4,5]] 11 >>> l[2] 12 [3, 4, 5] 13 >>> #列表中的列表中的元素该怎么访问呢? 14 >>> #第一步:通过l[2]取到了[3,4,5] 没毛病吧 15 >>> #第二步:给你一个[3,4,5],如何取元素呢?还用索引呗用 16 >>> #把两步结合到一起 ,看看怎么取到元素4 17 >>> l[2][1] 18 4 19 >>> #用这个方法可以嵌套很多很多层,只有有必要
特性四:
列表属于可变序列,列表元素可原位改变。
特性五:
5 列表的存储机制叫对象引用数组,跟之前讲过的变量的存储方式有关。
事先声明,这个截图是我截取的别人的,非原创。为了更好的说明,不惜盗图了。
为什么列表是异质的呢?就是由下图的这套机制决定的,个人理解,列表中存储的是实际内存对象的引用。
也就是列表中存储引用,具体这引用指向什么类型的对象就没有限制了,所以带给大家最直观的感受就是列表中可以存放任意类型的对象。
列表特殊操作一:
排序 sort()
1 >>> #先来一个列表,然后把顺序打乱,然后再排序 2 >>> import random 3 >>> l = list(range(5)) 4 >>> random.sh 5 Traceback (most recent call last): 6 File "<pyshell#43>", line 1, in <module> 7 random.sh 8 AttributeError: module ‘random‘ has no attribute ‘sh‘ 9 >>> 10 >>> random.shuffle(l) 11 >>> l 12 [3, 4, 0, 2, 1] 13 >>> l.sort() 14 >>> l 15 [0, 1, 2, 3, 4] 16 >>> #可见,sort()默认是按照从左到右的升序排序的 17 >>> #如果我想把排序的结果按照从左到右的降序排序有两种实现方法 18 >>> #1 19 >>> l.reverse() 20 >>> ls 21 Traceback (most recent call last): 22 File "<pyshell#53>", line 1, in <module> 23 ls 24 NameError: name ‘ls‘ is not defined 25 >>> l 26 [4, 3, 2, 1, 0] 27 >>> #就是sort()、reverse()两个函数结合着用 28 >>> 29 >>> #2 30 >>> random.shuffle(l) 31 >>> l 32 [1, 4, 3, 2, 0] 33 >>> l.sort(reverse=True) 34 >>> l 35 [4, 3, 2, 1, 0] 36 >>> #一步到位,排序加反转 37 38 >>> 39 >>> #想必刚才写sort(reverse=True)是已经到sort()的另外一个参数了,这个参数的作用是什么呢? 40 >>> #如果列表中存储的是元素的序列类型数据,想根据序列中的特定位置的元素进行排序 41 >>> l = [‘Mark‘,‘Tony‘,‘ndusigdn‘,‘vjisodfhgs‘] 42 >>> #如果我想将根据l中的所有元素的第二位进行排序并反转 43 >>> l.sort(key=lambda x:x[1],reverse=Ture) 44 Traceback (most recent call last): 45 File "<pyshell#68>", line 1, in <module> 46 l.sort(key=lambda x:x[1],reverse=Ture) 47 NameError: name ‘Ture‘ is not defined 48 >>> l.sort(key=lambda x:x[1],reverse=True) 49 >>> l 50 [‘Tony‘, ‘vjisodfhgs‘, ‘ndusigdn‘, ‘Mark‘] 51 >>> 52 53 >>> #如果列表中的元素是列表, 54 55 >>> l.sort(key=lambda x:x[1],reverse=True) 56 Traceback (most recent call last): 57 File "<pyshell#74>", line 1, in <module> 58 l.sort(key=lambda x:x[1],reverse=True) 59 File "<pyshell#74>", line 1, in <lambda> 60 l.sort(key=lambda x:x[1],reverse=True) 61 IndexError: list index out of range 62 >>> l 63 [[32464], [65472], [5468], [93525657], [87544346]] 64 >>> l.sort(key=lambda x:x[1]) 65 Traceback (most recent call last): 66 File "<pyshell#76>", line 1, in <module> 67 l.sort(key=lambda x:x[1]) 68 File "<pyshell#76>", line 1, in <lambda> 69 l.sort(key=lambda x:x[1]) 70 IndexError: list index out of range 71 >>> 72 >>> l = [[1,2,3,4,7],[43,657,43,256],[657,3,576,2454,67]] 73 >>> l.sort(key=lambda x:x[1],reverse=True) 74 >>> l 75 [[43, 657, 43, 256], [657, 3, 576, 2454, 67], [1, 2, 3, 4, 7]] 76 >>>
序列的排序还有一个方法,用全局函数排序 sorted(t),用法和l.sort()差不多。
这里需要注意一下两种排序方式对原序列的影响:
一:全局函数的方式并不改变原列表元素的顺序
1 >>> l = [‘Mark‘,‘Tony‘,‘ndusigdn‘,‘vjisodfhgs‘] 2 >>> l 3 [‘Mark‘, ‘Tony‘, ‘ndusigdn‘, ‘vjisodfhgs‘] 4 >>> sorted(l,key=lambda x:x[1],reverse=True) #全局函数sorted()直接就将排序结果返回了 5 [‘Tony‘, ‘vjisodfhgs‘, ‘ndusigdn‘, ‘Mark‘] 6 >>> l 7 [‘Mark‘, ‘Tony‘, ‘ndusigdn‘, ‘vjisodfhgs‘] #原序列中的元素值并没有改变 8 >>>
二:列表自带的函数会改变列表的元素的顺序
1 >>> l.sort(key=lambda x:x[1],reverse=True) #列表的sort()函数返回的数据类型为None 2 >>> l 3 [‘Tony‘, ‘vjisodfhgs‘, ‘ndusigdn‘, ‘Mark‘] #原列表中值的元素顺序发生变化 4 >>>